// Zakładka „Skompiluj" — składanie raportu (PRE-23). // // Raport ma trzy kawałki liczone w różnych miejscach: // 1. horoskop — liczy serwer przy wysłaniu tego formularza, // 2. interpretacja natalna — z zakładki Interpretacje (natal.js), // 3. predykcje okresowe — z zakładki Kalendarz (predictions.js). // // Punkty 2 i 3 mieszkają w magazynie przeglądarki, więc to tutaj je dokładamy. // Odczytujemy je przez API tamtych modułów, a nie sięgając wprost do // localStorage — dzięki temu format danych ma JEDNEGO właściciela. // // Pokazujemy też, CZEGO BRAKUJE. Bez tego użytkownik złożyłby niekompletny raport // i dowiedział się o tym dopiero po otwarciu PDF-a. (function () { 'use strict'; function esc(s) { return String(s == null ? '' : s) .replace(/&/g, '&').replace(//g, '>'); } function readNatal() { return (window.astrololoNatal && window.astrololoNatal.read()) || null; } function readPredictions() { return (window.astrololoPredictions && window.astrololoPredictions.read()) || []; } function item(ok, label, hint) { return '
  • ' + (ok ? '✓ ' : '✗ ') + esc(label) + (ok ? '' : ' — ' + esc(hint) + '') + '
  • '; } function renderReadiness(hasChart) { var host = document.getElementById('readiness'); if (!host) return; var natal = readNatal(); var preds = readPredictions(); var parts = [ item(hasChart, 'Policzony horoskop', 'wypełnij dane i kliknij „Złóż podsumowanie"'), item(!!natal, 'Interpretacja natalna', 'wygeneruj ją na zakładce Interpretacje — zapamięta się sama'), item(preds.length > 0, 'Predykcje okresowe' + (preds.length ? ' (' + preds.length + ')' : ''), 'policz horoskop na wybrany okres w Kalendarzu') ]; host.innerHTML = '
    Materiał do raportu
    '; } function renderNatal() { var host = document.getElementById('reportNatal'); if (!host) return; var natal = readNatal(); if (!natal) { host.innerHTML = '
    Interpretacja natalna
    ' + '

    Brak — wygeneruj ją na zakładce Interpretacje.

    '; return; } host.innerHTML = '
    Interpretacja natalna ' + '· zapamiętana ' + esc(String(natal.saved_at).slice(0, 10)) + '
    ' + esc(natal.text) + '
    '; } function renderPredictions() { var host = document.getElementById('reportPredictions'); if (!host) return; var preds = readPredictions(); if (!preds.length) { host.innerHTML = '
    Predykcje okresowe
    ' + '

    Brak — policz horoskop na wybrany okres w Kalendarzu.

    '; return; } var blocks = preds.map(function (p) { return '
    ' + esc(p.from_date) + ' – ' + esc(p.to_date) + '
    ' + '
    ' + esc(p.text) + '
    '; }).join(''); host.innerHTML = '
    Predykcje okresowe (' + preds.length + ')
    ' + blocks; } function ready(fn) { if (document.readyState !== 'loading') fn(); else document.addEventListener('DOMContentLoaded', fn); } // ── PDF (PRE-24) ──────────────────────────────────────────────────── // Części od AI mieszkają w przeglądarce, więc raport składamy TU i wysyłamy // do serwera, który dokłada kosmogram i woła usługę render. function formData() { function v(name) { var el = document.querySelector('[name=' + name + ']'); return el ? el.value : ''; } return { date: v('date'), time: v('time'), tz_offset: v('tz_offset'), lat: v('lat'), lon: v('lon'), house_system: v('house_system'), zodiac: v('zodiac'), place: (document.querySelector('#geoSearch') || {}).value || '' }; } function download(blob) { var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'raport.pdf'; document.body.appendChild(a); a.click(); a.remove(); // Zwalniamy obiekt dopiero po kliknięciu — wcześniej przeglądarka nie zdąży // rozpocząć pobierania. setTimeout(function () { URL.revokeObjectURL(url); }, 4000); } function buildPdf(btn, note) { var person = (document.querySelector('[name=person]') || {}).value || ''; var payload = { person: person, data: formData(), natal: readNatal() || {}, predictions: readPredictions() }; btn.disabled = true; note.textContent = 'Składam PDF — LaTeX potrzebuje chwili przy obszernym tekście…'; fetch('/compile/pdf', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).then(function (r) { if (!r.ok) { return r.json().catch(function () { return {}; }).then(function (d) { throw new Error(d.detail || ('HTTP ' + r.status)); }); } return r.blob(); }).then(function (blob) { download(blob); note.textContent = 'Gotowe — PDF pobrany.'; }).catch(function (e) { note.textContent = 'Nie udało się złożyć PDF-a: ' + e.message; }).finally(function () { btn.disabled = false; }); } ready(function () { if (!document.getElementById('readiness')) return; // nie ta zakładka // Horoskop jest w dokumencie tylko po wysłaniu formularza. renderReadiness(!!document.getElementById('reportPerson')); renderNatal(); renderPredictions(); var btn = document.getElementById('pdfBtn'); var note = document.getElementById('pdfNote'); if (btn && note) btn.addEventListener('click', function () { buildPdf(btn, note); }); }); })();