# -*- coding: utf-8 -*-
"""
generate_band.py - Komplette Pipeline fuer ein Band-PDF (SCHOENES Layout):
  1) Berechnung (Swiss Ephemeris, deterministisch)         -> hd, radix
  2) Charts rendern (Horoskoprad + Bodygraph als PNG)      -> wheel/bodygraph
  3) Textgenerierung (Claude-API, claude-opus-4-8)         -> content-Dict (94 Felder)
  4) content als JSON sichern (Review/Nachvollziehbarkeit)
  5) PDF-Bau (reportlab, schoenes Indigo-Layout)           -> Band_I_<Name>.pdf

Der API-Key kommt aus der Umgebungsvariable ANTHROPIC_API_KEY.
"""
import os
import json
import datetime
import swisseph as swe

HERE = os.path.dirname(os.path.abspath(__file__))
swe.set_ephe_path(os.path.join(HERE, 'ephe'))

from hd_engine import compute_chart
from radix_engine import compute_radix, local_to_ut
from radix_wheel import render_wheel
from hd_bodygraph import render_bodygraph
from text_generator import generate_content, validate_content
import band1_pipeline

_MONATE = ['Januar', 'Februar', 'M\u00e4rz', 'April', 'Mai', 'Juni', 'Juli',
           'August', 'September', 'Oktober', 'November', 'Dezember']

_BAND_LABEL = {
    'I': ('GRUNDPROFIL', ['Wer du bist,', 'wie dein Chart', 'funktioniert'],
          'Eine Auswertung in Astrologie und Human Design'),
}


def _datum_lang(jahr, monat, tag):
    return '%d. %s %d' % (tag, _MONATE[monat - 1], jahr)


def _koord_str(lat, lon):
    ns = 'N' if lat >= 0 else 'S'
    ew = 'O' if lon >= 0 else 'W'
    la = abs(lat); lo = abs(lon)
    return '%d\u00b0%02d %s / %d\u00b0%02d %s' % (
        int(la), int((la - int(la)) * 60), ns, int(lo), int((lo - int(lo)) * 60), ew)


def generate(name, jahr, monat, tag, stunde_lokal, minute, lat, lon, ort=None,
             tz='Europe/Berlin', hsys=b'K', band='I',
             geburt_text=None, out_dir=None, geschlecht=''):
    """Erzeugt ein Band-PDF Ende-zu-Ende. Gibt (pdf_pfad, json_pfad, usage) zurueck."""
    safe = name.replace(' ', '_')
    zeit_text = '%02d:%02d Uhr' % (stunde_lokal, minute)
    datum_text = _datum_lang(jahr, monat, tag)
    # ort darf fehlen: der Worker uebergibt teils nur geburt_text im Format
    # "Datum \u00b7 Zeit Uhr \u00b7 Ort". Dann den Ortsnamen aus dem letzten Segment ableiten.
    if not ort and geburt_text:
        ort = geburt_text.split('\u00b7')[-1].strip()
    ort = (ort or '').strip()
    geburt_text = geburt_text or ('%s \u00b7 %s \u00b7 %s' % (datum_text, zeit_text, ort))
    geburt_lang = '%s um %s in %s' % (datum_text, zeit_text, ort)

    # Ausgabe-/Klientenordner
    datum_kurz = datetime.date.today().isoformat()
    klient_dir = out_dir or os.path.join(HERE, 'klienten', f'{safe}_{datum_kurz}')
    os.makedirs(klient_dir, exist_ok=True)

    # 1) Berechnung -- UT konsistent ueber dieselbe Zeitzonen-Logik wie das Radix
    uy, um, ud, ut, _ = local_to_ut(jahr, monat, tag, stunde_lokal, minute, tz)
    ut_h = int(ut)
    ut_m = (ut - ut_h) * 60.0
    hd = compute_chart(uy, um, ud, ut_h, ut_m, name=name)
    radix = compute_radix(jahr, monat, tag, stunde_lokal, minute, lat, lon,
                          tz=tz, hsys=hsys, name=name)

    # 2) Charts als PNG rendern
    wheel_path = os.path.join(klient_dir, 'wheel.png')
    body_path = os.path.join(klient_dir, 'bodygraph.png')
    render_wheel(radix, wheel_path)
    render_bodygraph(hd, body_path)

    # 3) Textgenerierung ueber die Claude-API -> volles content-Dict (94 Felder)
    content, usage = generate_content(
        hd, radix, name, geburt_text, band=band,
        klient_kurz=name.split()[0], geburt_lang=geburt_lang,
        geschlecht=geschlecht)

    fehlen = validate_content(content)
    if fehlen:
        print('WARNUNG: Im content fehlen Felder:', fehlen)

    # 4) content als JSON sichern (Qualitaets-Review in der Anfangsphase)
    json_path = os.path.join(klient_dir, f'content_{band}.json')
    with open(json_path, 'w', encoding='utf-8') as f:
        json.dump(content, f, ensure_ascii=False, indent=2)

    # 5) HEAD bauen + PDF bauen (schoenes Layout)
    label, titel_zeilen, untertitel = _BAND_LABEL.get(band, _BAND_LABEL['I'])
    HEAD = {
        'klient': name,
        'geburt_datum': datum_text,
        'geburt_zeit': zeit_text,
        'geburt_ort': ort,
        'geburt_koord': _koord_str(lat, lon),
        'hsys_name': 'Koch' if hsys == b'K' else (hsys.decode() if isinstance(hsys, bytes) else str(hsys)),
        'band_nr_roman': band,
        'band_anzahl_roman': 'VII',
        'band_label': label,
        'band_titel_zeilen': titel_zeilen,
        'band_untertitel': untertitel,
        'wheel_path': wheel_path,
        'bodygraph_path': body_path,
    }
    pdf_path = os.path.join(klient_dir, f'Band_{band}_{safe}.pdf')
    band1_pipeline.build(content, hd, radix, HEAD, pdf_path)

    print(f"PDF:  {pdf_path}")
    print(f"JSON: {json_path}")
    print(f"Tokens -> in: {usage['input_tokens']}  out: {usage['output_tokens']}")
    return pdf_path, json_path, usage


if __name__ == '__main__':
    # Testlauf mit Dirks Daten (benoetigt gesetzten ANTHROPIC_API_KEY)
    generate(
        name='Dirk Zessin',
        jahr=1976, monat=3, tag=31, stunde_lokal=15, minute=0,
        lat=53.55, lon=10.0, ort='Hamburg',
        tz='Europe/Berlin', hsys=b'K', band='I',
    )
