#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys as _sys
_sys.stdout.reconfigure(encoding="utf-8", errors="replace")
_sys.stderr.reconfigure(encoding="utf-8", errors="replace")
"""
07_doplnit_zahajeni.py
======================
Pro nové pacienty (první dávka po 31.12.2024) kteří jsou již ukončeni
a nemají záznam v vzp_registrace_lekari pro naše ICP=09305001,
dotáže se VZP k datu jejich první dávky — tehdy tam ještě byli
a odpověď obsahuje datumZahajeni registrace u nás.

Výsledek uloží do vzp_registrace_lekari (stejná tabulka jako kdojelekar).
"""

import sys
import time
from datetime import date
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "Knihovny"))
from mysql_db import connect_mysql
from vzpb2b_client import VZPB2BClient

PFX_PATH     = str(Path(__file__).resolve().parents[1] / "Certificates" / "picka.pfx")
PFX_PASSWORD = "Vlado7309208104+"
ICZ          = "09305000"
NASA_ICP     = "09305001"
API_PAUSE    = 2

PRVNI_DAVKA = date(2024, 12, 1)

# ── Načtení kandidátů ─────────────────────────────────────────────────────────
conn = connect_mysql()
cur  = conn.cursor()

# Noví pacienti (prvni_davka > 31.12.2024) bez záznamu v registrace pro naše ICP
cur.execute("""
    SELECT
        s.cip,
        MIN(s.prijmeni) AS prijmeni,
        MIN(s.jmeno)    AS jmeno,
        MIN(DATE(CONCAT(s.davka_rok,'-',LPAD(s.davka_mesic,2,'0'),'-',LPAD(s.davka_den,2,'0')))) AS prvni_davka
    FROM seznam_pojistencu_davky s
    WHERE s.pojistovna = '111'
    GROUP BY s.cip
    HAVING prvni_davka > %s
""", (PRVNI_DAVKA,))
vsichni_novi = {r[0]: (r[1], r[2], r[3]) for r in cur.fetchall()}

# Kteří z nich už mají záznam v registrace pro naše ICP
cur.execute("""
    SELECT DISTINCT rc FROM vzp_registrace_lekari
    WHERE ICP = %s AND kod_odbornosti = '001' AND ma_lekare = 1
""", (NASA_ICP,))
uz_maji = {r[0] for r in cur.fetchall()}

kandidati = {
    cip: info
    for cip, info in vsichni_novi.items()
    if cip not in uz_maji
}

print(f"Noví pacienti celkem:      {len(vsichni_novi)}")
print(f"Již mají datum zahájení:   {len(uz_maji & vsichni_novi.keys())}")
print(f"Ke doplnění:               {len(kandidati)}")

if not kandidati:
    print("Vše je kompletní.")
    cur.close(); conn.close(); sys.exit(0)

vzp = VZPB2BClient("prod", PFX_PATH, PFX_PASSWORD, icz=ICZ)

print()
sirka = max(len(f"{p} {j}") for p, j, _ in kandidati.values()) + 2

for i, (cip, (prijmeni, jmeno, prvni_davka)) in enumerate(kandidati.items(), 1):
    print(f"[{i:>2}/{len(kandidati)}] {prijmeni+' '+jmeno:<{sirka}} ({cip})  k {prvni_davka}", end="  ", flush=True)

    try:
        xml     = vzp.registrace_lekare(cip, prvni_davka.isoformat(), odbornosti=["001"])
        time.sleep(API_PAUSE)
        zaznamy = vzp.parse_registrace_lekare(xml)
    except Exception as e:
        print(f"CHYBA: {e}")
        continue

    nas_zaznam = next(
        (z for z in zaznamy
         if z.get("ma_lekare") and z.get("ICP") == NASA_ICP and z.get("kod_odbornosti") == "001"),
        None
    )

    if not nas_zaznam:
        print("→ nenalezen k tomuto datu")
        continue

    def to_date(s):
        try:
            return date.fromisoformat(s) if s else None
        except ValueError:
            return None

    poj_el = nas_zaznam
    cur.execute("""
        INSERT INTO vzp_registrace_lekari
            (rc, prijmeni, jmeno, k_datu, kod_odbornosti, ma_lekare,
             ICZ, ICP, nazev_lekare, nazev_zzz,
             poj_kod, poj_zkratka,
             datum_registrace, datum_zahajeni, datum_ukonceni, stav_vyrizeni)
        VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
        ON DUPLICATE KEY UPDATE
            datum_zahajeni  = VALUES(datum_zahajeni),
            datum_ukonceni  = VALUES(datum_ukonceni),
            nazev_lekare    = VALUES(nazev_lekare),
            nazev_zzz       = VALUES(nazev_zzz)
    """, (
        cip, prijmeni, jmeno, prvni_davka, "001", 1,
        nas_zaznam.get("ICZ"), nas_zaznam.get("ICP"),
        nas_zaznam.get("nazev_lekare"), nas_zaznam.get("nazev_zzz"),
        nas_zaznam.get("poj_kod"), nas_zaznam.get("poj_zkratka"),
        to_date(nas_zaznam.get("datum_registrace")),
        to_date(nas_zaznam.get("datum_zahajeni")),
        to_date(nas_zaznam.get("datum_ukonceni")),
        nas_zaznam.get("stav_vyrizeni"),
    ))

    dz = nas_zaznam.get("datum_zahajeni") or "?"
    du = nas_zaznam.get("datum_ukonceni") or "?"
    print(f"→ zahájení: {dz}  ukončení: {du}")

cur.close()
conn.close()
print(f"\nHotovo.")
