function downloadText(filename, content, type) {
  const blob = new Blob([content], { type });
  const a = document.createElement('a');
  a.href = URL.createObjectURL(blob);
  a.download = filename;
  a.click();
  URL.revokeObjectURL(a.href);
}

function exportJSON() {
  const data = collectData();
  const year = data.obdobie || '2025';
  downloadText(`danove_priznanie_${data.activeForm}_${year}.json`, JSON.stringify(data, null, 2), 'application/json');
}

function xmlEscape(value) {
  return String(value ?? '')
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&apos;');
}

function xmlMoney(value) {
  return roundCents(value).toFixed(2);
}

function exportXML() {
  calculate();
  const data = collectData();
  const calc = getCalculation();
  const type = data.activeForm;
  const year = data.obdobie || calc.period.year;
  const rows = type === 'A'
    ? [
      ['r32_uhrn_prijmov', calc.income],
      ['r33_poistne', calc.expenses],
      ['r36_ciastkovy_zaklad', calc.partialBase],
      ['r40_nczd', calc.nczd],
      ['r56_zaklad_dane', calc.taxBase],
      ['r64_dan', calc.tax],
      ['r66_preddavky', calc.advances],
      ['r72_na_uhradu', Math.max(calc.settlement, 0)],
      ['r73_preplatok', Math.max(calc.settlement * -1, 0)]
    ]
    : [
      ['r38_prijmy_paragraf_6', calc.income],
      ['r39_vydavky_paragraf_6', calc.expenses],
      ['r43_ciastkovy_zaklad', calc.partialBase],
      ['r55_odpocet_straty', calc.loss],
      ['r56_zaklad_dane', calc.taxBase],
      ['r96_dan_paragraf_6', calc.tax],
      ['r115_preddavky', calc.advances],
      ['r124_na_uhradu', Math.max(calc.settlement, 0)],
      ['r125_preplatok', Math.max(calc.settlement * -1, 0)]
    ];

  const xml = `<?xml version="1.0" encoding="UTF-8"?>
<DanovePriznanieFO xmlns="urn:sk:taxforms:draft" verzia="1.1">
  <Meta>
    <Typ>${type}</Typ>
    <ZdanovacieObdobie rok="${xmlEscape(year)}">
      <Od>${xmlEscape(data.obdobie_od)}</Od>
      <Do>${xmlEscape(data.obdobie_do)}</Do>
    </ZdanovacieObdobie>
    <Upozornenie>Pracovny XML export z tejto aplikacie. Pred elektronickym podanim overte aktualnu XSD schemu a oficialne tlacivo Financnej spravy SR.</Upozornenie>
  </Meta>
  <Danovnik>
    <MenoPriezvisko>${xmlEscape(data.meno)}</MenoPriezvisko>
    <RodneCislo>${xmlEscape(data.rc)}</RodneCislo>
    <Adresa>${xmlEscape(data.adresa)}</Adresa>
    <IBAN>${xmlEscape((data.iban || '').replace(/\s+/g, ''))}</IBAN>
    <DanovyUrad>${xmlEscape(data.danovy_urad)}</DanovyUrad>
  </Danovnik>
  <Vypocet>
    ${rows.map(([name, value]) => `<${name}>${xmlMoney(value)}</${name}>`).join('\n    ')}
    <Sadzby>${calc.bands.map(item => `${xmlMoney(item.base)}@${(item.rate * 100).toFixed(0)}%`).join(';')}</Sadzby>
  </Vypocet>
</DanovePriznanieFO>
`;

  downloadText(`DPFO_${type}_${year}.xml`, xml, 'application/xml');
}

function importJSON(file) {
  const reader = new FileReader();
  reader.onload = e => {
    applyData(JSON.parse(e.target.result));
    calculate();
  };
  reader.readAsText(file);
}

function renderPdfForm(result = getCalculation()) {
  const data = collectData();
  const rows = result.form === 'A'
    ? [
      ['32', 'Úhrn zdaniteľných príjmov zo závislej činnosti', result.income],
      ['33', 'Povinné poistné a príspevky', result.expenses],
      ['36', 'Čiastkový základ dane podľa § 5', result.partialBase],
      ['40', 'Nezdaniteľná časť základu dane na daňovníka', result.nczd],
      ['56', 'Základ dane po znížení', result.taxBase],
      ['64', 'Daň', result.tax],
      ['66', 'Zrazené preddavky na daň', result.advances],
      ['72', 'Daň na úhradu', Math.max(result.settlement, 0)],
      ['73', 'Daňový preplatok', Math.max(result.settlement * -1, 0)]
    ]
    : [
      ['38', 'Príjmy z podnikania a inej samostatnej zárobkovej činnosti', result.income],
      ['39', 'Výdavky', result.expenses],
      ['43', 'Čiastkový základ dane podľa § 6', result.partialBase],
      ['55', 'Odpočet daňovej straty', result.loss],
      ['56', 'Základ dane po znížení', result.taxBase],
      ['96', 'Daň z príjmov podľa § 6', result.tax],
      ['115', 'Zaplatené preddavky na daň', result.advances],
      ['124', 'Daň na úhradu', Math.max(result.settlement, 0)],
      ['125', 'Daňový preplatok', Math.max(result.settlement * -1, 0)]
    ];

  document.getElementById('pdfForm').innerHTML = `
    <section class="pdf-page">
      <div class="pdf-header">
        <div>
          <p class="pdf-kicker">Daňové priznanie k dani z príjmov fyzickej osoby</p>
          <h1>Typ ${xmlEscape(result.form)} za zdaňovacie obdobie ${xmlEscape(data.obdobie || result.period.year)}</h1>
        </div>
        <div class="pdf-stamp">FO<br>DP${xmlEscape(result.form)}</div>
      </div>
      <div class="pdf-row">
        <span>Daňový úrad</span><strong>${xmlEscape(data.danovy_urad)}</strong>
        <span>Obdobie</span><strong>${xmlEscape(data.obdobie_od)} - ${xmlEscape(data.obdobie_do)}</strong>
      </div>
      <h2>I. oddiel - Údaje o daňovníkovi</h2>
      <div class="pdf-box-grid">
        <div><span>Meno a priezvisko</span><strong>${xmlEscape(data.meno)}</strong></div>
        <div><span>Rodné číslo</span><strong>${xmlEscape(data.rc)}</strong></div>
        <div><span>Adresa</span><strong>${xmlEscape(data.adresa)}</strong></div>
        <div><span>IBAN</span><strong>${xmlEscape(data.iban)}</strong></div>
      </div>
      <h2>Výpočet dane</h2>
      <table class="pdf-table">
        <thead><tr><th>Riadok</th><th>Popis</th><th>Suma v eurách</th></tr></thead>
        <tbody>
          ${rows.map(row => `<tr><td>${row[0]}</td><td>${xmlEscape(row[1])}</td><td>${xmlMoney(row[2])}</td></tr>`).join('')}
        </tbody>
      </table>
      <p class="pdf-note">${xmlEscape(result.period.source)}</p>
      <div class="pdf-sign">
        <span>Dátum vyhotovenia</span>
        <span>Podpis daňovníka</span>
      </div>
    </section>
  `;
}
