// ═══════════════════════════════════════════════════════════════
//  data.jsx — constants, prefilled company, currency + words helpers
// ═══════════════════════════════════════════════════════════════

// Fixed BGN ↔ EUR rate (Bulgaria eurozone transition, irrevocable peg)
const BGN_PER_EUR = 1.95583;

// ─── Storage key ───
const STORE_KEY = "ss-invoice-v1";

// ─── Currencies ───
const CURRENCIES = {
  EUR: { code: "EUR", sym: "€", bg: "евро", en: "EUR" },
  BGN: { code: "BGN", sym: "лв.", bg: "лева", en: "BGN" },
  USD: { code: "USD", sym: "$", bg: "долара", en: "USD" },
};

// ─── Document types ───
const DOC_TYPES = [
  { v: "invoice",  bg: "Фактура",            en: "Invoice" },
  { v: "proforma", bg: "Проформа фактура",   en: "Proforma Invoice" },
  { v: "credit",   bg: "Кредитно известие",  en: "Credit Note" },
  { v: "debit",    bg: "Дебитно известие",   en: "Debit Note" },
];

// ─── VAT rates ───
const VAT_RATES = [
  { v: 20, l: "20%" },
  { v: 9,  l: "9%" },
  { v: 0,  l: "0%" },
];

// ─── VAT exemption grounds (чл. от ЗДДС) ───
const VAT_GROUNDS = [
  { v: "", bg: "— Не се прилага —", en: "— Not applicable —" },
  { v: "art86-3-21", bg: "чл. 86, ал. 3 и чл. 21 от ЗДДС", en: "Art. 86(3) and Art. 21 of the VAT Act" },
  { v: "art21", bg: "чл. 21 от ЗДДС — услуга извън територията на страната", en: "Art. 21 of the VAT Act — service outside the country" },
  { v: "art82-2", bg: "чл. 82, ал. 2 от ЗДДС — обратно начисляване", en: "Art. 82(2) of the VAT Act — reverse charge" },
  { v: "art113-9", bg: "чл. 113, ал. 9 от ЗДДС — нерегистриран по ЗДДС", en: "Art. 113(9) of the VAT Act — not VAT registered" },
  { v: "art28", bg: "чл. 28 от ЗДДС — износ извън ЕС", en: "Art. 28 of the VAT Act — export outside the EU" },
  { v: "art53", bg: "чл. 53 от ЗДДС — вътреобщностна доставка", en: "Art. 53 of the VAT Act — intra-community supply" },
  { v: "custom", bg: "Друго (ръчно въвеждане)", en: "Other (manual entry)" },
];

// ─── Bulgarian banks (name + BIC) ───
const BANKS = [
  { n: "", bic: "", l: "— Изберете банка —" },
  { n: "Банка ДСК", nEn: "DSK Bank", bic: "STSABGSF", l: "Банка ДСК / DSK Bank" },
  { n: "УниКредит Булбанк", nEn: "UniCredit Bulbank", bic: "UNCRBGSF", l: "УниКредит Булбанк" },
  { n: "ОББ", nEn: "UBB", bic: "UBBSBGSF", l: "ОББ / UBB" },
  { n: "Юробанк (Пощенска)", nEn: "Eurobank", bic: "BPBIBGSF", l: "Юробанк / Postbank" },
  { n: "Райфайзенбанк", nEn: "Raiffeisenbank", bic: "RZBBBGSF", l: "Райфайзенбанк" },
  { n: "Първа инвестиционна банка", nEn: "Fibank", bic: "FINVBGSF", l: "ПИБ / Fibank" },
  { n: "Централна кооперативна банка", nEn: "CCB", bic: "CECBBGSF", l: "ЦКБ / CCB" },
  { n: "Wise", nEn: "Wise", bic: "TRWIBEB1XXX", l: "Wise" },
  { n: "Revolut", nEn: "Revolut", bic: "REVOLT21", l: "Revolut" },
  { n: "_other", nEn: "_other", bic: "", l: "Друга…" },
];

// ─── Payment methods ───
const PAY_METHODS = [
  { v: "bank", bg: "Банков превод", en: "Bank transfer" },
  { v: "cash", bg: "В брой", en: "Cash" },
  { v: "card", bg: "С карта", en: "Card" },
  { v: "wise", bg: "Wise", en: "Wise" },
  { v: "revolut", bg: "Revolut", en: "Revolut" },
  { v: "paypal", bg: "PayPal", en: "PayPal" },
];

// ─── Invoice design styles ───
const DOC_STYLES = [
  { v: "studio",  bg: "Studio",      desc: "Брандиран — paper фон, ink/син" },
  { v: "minimal", bg: "Минимален",   desc: "Бяло, тънки линии, въздух" },
  { v: "ledger",  bg: "Счетоводен",  desc: "Структуриран, решетка, формален" },
  { v: "band",    bg: "Лента",       desc: "Тъмна ink лента в шапката" },
];

// ─── Prefilled supplier (from your inv.bg invoice) ───
const DEFAULT_COMPANY = {
  name: "Шорткът Студио ЕООД",
  nameEn: "Shortcut Studio Ltd.",
  eik: "208705733",
  vatId: "BG208705733",
  address: "ул. Преки път 6, ет. 2, ап. 7, кв. Бъкстон, 1618 София, България",
  addressEn: "6 Preki Pat Str., fl. 2, apt. 7, Buxton, 1618 Sofia, Bulgaria",
  mol: "Тодор Тодоров",
  molEn: "Todor Todorov",
  bank: "Банка ДСК",
  bankEn: "DSK Bank",
  iban: "BG21STSA93000032551069",
  bic: "STSABGSF",
};

const DEFAULT_CLIENT = { name: "", nameEn: "", eik: "", vatId: "", address: "", addressEn: "", mol: "", molEn: "" };
const DEFAULT_ITEM = { desc: "", descEn: "", qty: 1, unit: "бр.", unitEn: "pcs.", price: 0, disc: 0, discType: "%", vat: 20 };

// ═══════════════════════════════════════════════════════════════
//  Helpers
// ═══════════════════════════════════════════════════════════════
const today = () => new Date().toISOString().split("T")[0];
const padNum = n => String(n).padStart(10, "0");

const fmtDate = (d) => {
  if (!d) return "";
  const [y, m, day] = d.split("-");
  return `${day}.${m}.${y}`;
};

// number → "1 234.56"
const fmtNum = (n) => {
  const parts = (Math.round(n * 100) / 100).toFixed(2).split(".");
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, " ");
  return parts.join(".");
};

// Convert a EUR/BGN amount to its peg counterpart. Returns null if no peg.
const pegOf = (amount, cur) => {
  if (cur === "EUR") return { code: "BGN", value: amount * BGN_PER_EUR };
  if (cur === "BGN") return { code: "EUR", value: amount / BGN_PER_EUR };
  return null;
};

const money = (n, cur) => `${fmtNum(n)} ${cur}`;

// ─── Item line math ───
const lineCalc = (it, groundActive, defaultVat) => {
  const gross = (Number(it.qty) || 0) * (Number(it.price) || 0);
  const disc = (it.discType || "%") === "%"
    ? gross * ((Number(it.disc) || 0) / 100)
    : (Number(it.disc) || 0);
  const net = gross - disc;
  const rate = groundActive ? 0 : (it.vat ?? defaultVat);
  const vat = net * (rate / 100);
  return { gross, disc, net, vat, total: net + vat, rate };
};

// ═══════════════════════════════════════════════════════════════
//  Amount in words — Bulgarian
// ═══════════════════════════════════════════════════════════════
const BG_ONES = ["", "един", "два", "три", "четири", "пет", "шест", "седем", "осем", "девет"];
const BG_ONES_F = ["", "една", "две", "три", "четири", "пет", "шест", "седем", "осем", "девет"];
const BG_TEENS = ["десет", "единадесет", "дванадесет", "тринадесет", "четиринадесет", "петнадесет", "шестнадесет", "седемнадесет", "осемнадесет", "деветнадесет"];
const BG_TENS = ["", "", "двадесет", "тридесет", "четиридесет", "петдесет", "шестдесет", "седемдесет", "осемдесет", "деветдесет"];
const BG_HUNDREDS = ["", "сто", "двеста", "триста", "четиристотин", "петстотин", "шестстотin", "седемстотин", "осемстотин", "деветстотин"];

function bgHundreds(n, fem) {
  const h = Math.floor(n / 100), r = n % 100, t = Math.floor(r / 10), o = r % 10, p = [];
  if (h > 0) p.push(["", "сто", "двеста", "триста", "четиристотин", "петстотин", "шестстотин", "седемстотин", "осемстотин", "деветстотин"][h]);
  if (r >= 10 && r < 20) { if (p.length) p.push("и"); p.push(BG_TEENS[r - 10]); }
  else {
    if (t > 0) { if (p.length && o === 0) p.push("и"); p.push(BG_TENS[t]); }
    if (o > 0) { if (p.length) p.push("и"); p.push(fem ? BG_ONES_F[o] : BG_ONES[o]); }
  }
  return p.join(" ");
}
function bgWords(n) {
  if (n === 0) return "нула";
  const p = [], m = Math.floor(n / 1e6), th = Math.floor((n % 1e6) / 1e3), r = Math.floor(n % 1e3);
  if (m > 0) p.push(m === 1 ? "един милион" : bgHundreds(m, false) + " милиона");
  if (th > 0) p.push(th === 1 ? "хиляда" : bgHundreds(th, true) + " хиляди");
  if (r > 0) { if (p.length && r < 100) p.push("и " + bgHundreds(r, false)); else p.push(bgHundreds(r, false)); }
  return p.join(" ").replace(/\s+/g, " ").trim();
}

// ═══════════════════════════════════════════════════════════════
//  Amount in words — English
// ═══════════════════════════════════════════════════════════════
const EN_ONES = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"];
const EN_TENS = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"];
function enHundreds(n) {
  const p = [];
  const h = Math.floor(n / 100), r = n % 100;
  if (h > 0) { p.push(EN_ONES[h] + " hundred"); }
  if (r > 0) {
    if (r < 20) p.push(EN_ONES[r]);
    else { const t = Math.floor(r / 10), o = r % 10; p.push(EN_TENS[t] + (o ? "-" + EN_ONES[o] : "")); }
  }
  return p.join(" ");
}
function enWords(n) {
  if (n === 0) return "zero";
  const p = [], m = Math.floor(n / 1e6), th = Math.floor((n % 1e6) / 1e3), r = Math.floor(n % 1e3);
  if (m > 0) p.push(enHundreds(m) + " million");
  if (th > 0) p.push(enHundreds(th) + " thousand");
  if (r > 0) p.push(enHundreds(r));
  return p.join(" ");
}

// Amount-in-words for a currency, in a language. Cents named per currency.
function amountWords(amount, cur, lang) {
  const whole = Math.floor(amount);
  const cents = Math.round((amount - whole) * 100);
  if (lang === "en") {
    const unit = cur; // "EUR" / "BGN" / "USD"
    let s = enWords(whole) + " " + unit;
    if (cents > 0) s += " and " + enWords(cents) + (cur === "USD" ? " cents" : " cents");
    return s.charAt(0).toUpperCase() + s.slice(1);
  }
  // BG
  const c = CURRENCIES[cur];
  let s = bgWords(whole) + " " + c.bg;
  if (cents > 0) s += " и " + bgWords(cents) + " ст.";
  return s.charAt(0).toUpperCase() + s.slice(1);
}

Object.assign(window, {
  BGN_PER_EUR, STORE_KEY, CURRENCIES, DOC_TYPES, VAT_RATES, VAT_GROUNDS,
  BANKS, PAY_METHODS, DOC_STYLES, DEFAULT_COMPANY, DEFAULT_CLIENT, DEFAULT_ITEM,
  today, padNum, fmtDate, fmtNum, pegOf, money, lineCalc, amountWords,
});
