// 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); });
});
})();