const SJS_CONFIG = {
  EVENT_TITLE: 'Saint Joseph School Dinajpur',
  EVENT_SUBTITLE: 'Reunion 2026 · পুনর্মিলনী',
  EVENT_DATE: 'Friday, 5 June 2026',
  EVENT_VENUE: 'School Campus · Dinajpur',
  BKASH_NUMBER: '01XXX-XXXXXX',
  NAGAD_NUMBER: '01XXX-XXXXXX',
  BANK: {
    name: 'Bank Asia Ltd.',
    branch: 'Dinajpur Branch',
    accountName: 'SJS Dinajpur Reunion 2026',
    accountNumber: '0000 0000 0000 0000',
    routing: '070270000',
  },
  BATCH_FEE_RANGES: [
    { min: 1950, max: 1999, label: 'SSC 1950–1999', fee: 3000 },
    { min: 2000, max: 2009, label: 'SSC 2000–2009', fee: 2500 },
    { min: 2010, max: 2019, label: 'SSC 2010–2019', fee: 2000 },
    { min: 2020, max: 2026, label: 'SSC 2020–2026', fee: 1500 },
  ],
  FEES: {
    spouse: 1500,
    child: 800,
    familyMember: 1500,
    driver: 700,
    supportStaff: 700,
  },
};

function findBatchRule(year) {
  if (!year) return null;
  return SJS_CONFIG.BATCH_FEE_RANGES.find((r) => year >= r.min && year <= r.max);
}

function calcTotal(data) {
  const year = Number(data.sscYear);
  const rule = findBatchRule(year);
  const rows = [];
  let total = 0;
  if (rule) {
    total += rule.fee;
    rows.push({ label: `Batch fee · ${rule.label}`, amount: rule.fee });
  }
  if (data.spouse === 'Yes') {
    total += SJS_CONFIG.FEES.spouse;
    rows.push({ label: 'Spouse', amount: SJS_CONFIG.FEES.spouse });
  }
  const c = Number(data.childCount || 0);
  if (c > 0) {
    const v = c * SJS_CONFIG.FEES.child;
    total += v;
    rows.push({ label: `Children × ${c}`, amount: v });
  }
  const f = Number(data.familyMemberCount || 0);
  if (f > 0) {
    const v = f * SJS_CONFIG.FEES.familyMember;
    total += v;
    rows.push({ label: `Family / guest × ${f}`, amount: v });
  }
  if (data.driver === 'Yes') {
    total += SJS_CONFIG.FEES.driver;
    rows.push({ label: 'Driver', amount: SJS_CONFIG.FEES.driver });
  }
  const s = Number(data.supportStaffCount || 0);
  if (s > 0) {
    const v = s * SJS_CONFIG.FEES.supportStaff;
    total += v;
    rows.push({ label: `Support staff × ${s}`, amount: v });
  }
  return { total, rows, rule };
}

function makeRegId() {
  const r = Math.random().toString(36).slice(2, 8).toUpperCase();
  return 'SJS-' + r;
}

function emptyForm() {
  return {
    fullName: '',
    mobile: '',
    email: '',
    sscYear: '',
    profession: '',
    currentCity: '',
    spouse: 'No',
    childCount: 0,
    familyMemberCount: 0,
    driver: 'No',
    supportStaffCount: 0,
    paymentMethod: '',
    senderNumber: '',
    transactionId: '',
    amountPaid: '',
    notes: '',
    confirm_url: '',
  };
}

function loadSubmissions() {
  try {
    return JSON.parse(localStorage.getItem('sjs-reunion-2026-submissions') || '[]');
  } catch (e) {
    return [];
  }
}

function saveSubmission(entry) {
  const all = loadSubmissions();
  all.push({ ...entry, syncedAt: entry.syncedAt || null });
  localStorage.setItem('sjs-reunion-2026-submissions', JSON.stringify(all));
}

function markSubmissionSynced(registrationId) {
  const all = loadSubmissions();
  const idx = all.findIndex((r) => r.registrationId === registrationId);
  if (idx < 0) return;
  all[idx] = { ...all[idx], syncedAt: new Date().toISOString() };
  localStorage.setItem('sjs-reunion-2026-submissions', JSON.stringify(all));
}

async function submitToEndpoint(reg, endpoint, secret) {
  if (!endpoint) return { ok: false, reason: 'no_endpoint' };
  try {
    const res = await fetch(endpoint, {
      method: 'POST',
      mode: 'cors',
      redirect: 'follow',
      headers: { 'Content-Type': 'text/plain;charset=utf-8' },
      body: JSON.stringify({ ...reg, token: secret || '' }),
    });
    const text = await res.text();
    let parsed;
    try { parsed = JSON.parse(text); } catch (_) {
      return { ok: false, reason: 'bad_response', body: text };
    }
    if (parsed && parsed.ok) return { ok: true, duplicate: !!parsed.duplicate };
    return { ok: false, reason: (parsed && parsed.error) || 'server_error' };
  } catch (err) {
    return { ok: false, reason: 'network_error', error: String((err && err.message) || err) };
  }
}

let __sjsRetryInFlight = false;
async function retryUnsyncedSubmissions(endpoint, secret) {
  if (!endpoint || __sjsRetryInFlight) return { attempted: 0, synced: 0 };
  __sjsRetryInFlight = true;
  try {
    const pending = loadSubmissions().filter((r) => !r.syncedAt);
    let synced = 0;
    for (const reg of pending) {
      const result = await submitToEndpoint(reg, endpoint, secret);
      if (result.ok) {
        markSubmissionSynced(reg.registrationId);
        synced++;
      }
    }
    return { attempted: pending.length, synced };
  } finally {
    __sjsRetryInFlight = false;
  }
}

function SJSCrest({ size = 64, invert = false }) {
  return (
    <img
      src="assets/sjs-logo.png"
      alt="Saint Joseph School Dinajpur"
      width={size}
      height={size}
      style={{
        display: 'block',
        objectFit: 'contain',
        filter: invert ? 'brightness(0) invert(1)' : 'none',
      }}
    />
  );
}

Object.assign(window, {
  SJS_CONFIG,
  findBatchRule,
  calcTotal,
  makeRegId,
  emptyForm,
  loadSubmissions,
  saveSubmission,
  markSubmissionSynced,
  submitToEndpoint,
  retryUnsyncedSubmissions,
  SJSCrest,
});
