#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
kdojelekar_tydenni.py
======================
Projde aktivně registrované pacienty z Medicus a pro každého zjistí
registrujícího lékaře u VZP (odbornosti 001, 002, 014).
Výsledky uloží do MySQL tabulky vzp_registrace_lekari.

Spouštět týdně. Mezi dotazy 2s prodleva (API_DELAY).

TEST_MODE = True  → zpracuje jen 3 náhodné pacienty, bez zápisu do DB.
TEST_MODE = False → produkční běh, zapíše vše.
"""

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

PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(PROJECT_ROOT))

from Knihovny.vzpb2b_client import VZPB2BClient
from Knihovny.mysql_db import connect_mysql
from Knihovny.medicus_db import get_medicus_db

# ── KONFIGURACE ───────────────────────────────────────────────────────────────

API_PAUSE  = 2                        # sekundy mezi VZP dotazy

TEST_MODE  = False   # False = produkční běh

PFX_PATH   = Path(__file__).resolve().parent.parent / "Certificates" / "picka.pfx"
PFX_PASS   = "Vlado7309208104+"
ODBORNOSTI = None   # None = bez filtru, VZP vrátí všechny odbornosti

TODAY = date.today()

# ── INIT ──────────────────────────────────────────────────────────────────────

vzp   = VZPB2BClient("prod", str(PFX_PATH), PFX_PASS)
mysql = connect_mysql()

# ── PACIENTI Z MEDICUS ────────────────────────────────────────────────────────

medicus  = get_medicus_db()
pacienti = medicus.get_active_registered_patients(as_dict=True)
medicus.close()

print(f"Aktivně registrovaných pacientů: {len(pacienti)}")

if TEST_MODE:
    pacienti = random.sample(pacienti, min(3, len(pacienti)))
    print(f"TEST MODE — zpracuji {len(pacienti)} náhodné pacienty, BEZ zápisu do DB\n")
else:
    # Načti RC která už dnes mají uložený raw XML — ty přeskočíme
    with mysql.cursor() as cur:
        cur.execute("SELECT rc FROM vzp_registrace_raw WHERE k_datu = %s", (TODAY,))
        hotove = {row[0] for row in cur.fetchall()}
    pacienti = [p for p in pacienti if (p.get("rodcis") or "").strip() not in hotove]
    print(f"PRODUKČNÍ běh — k_datu={TODAY}, zbývá zpracovat: {len(pacienti)} pacientů"
          f" ({len(hotove)} již hotovo dnes)\n")

# ── BATCH ─────────────────────────────────────────────────────────────────────

call_count = 0

for i, pac in enumerate(pacienti):
    rc       = (pac.get("rodcis") or "").strip()
    prijmeni = (pac.get("prijmeni") or "").strip()
    jmeno    = (pac.get("jmeno") or "").strip()

    if not rc:
        continue

    if call_count > 0:
        time.sleep(API_PAUSE)
    call_count += 1

    print(f"[{i+1}/{len(pacienti)}] {prijmeni} {jmeno} ({rc}) ...", end=" ", flush=True)

    try:
        xml      = vzp.registrace_lekare(rc=rc, k_datu=TODAY.isoformat(), odbornosti=ODBORNOSTI)
        zaznamy  = vzp.parse_registrace_lekare(xml)
    except Exception as e:
        print(f"CHYBA: {e}")
        continue

    print(f"{len(zaznamy)} lékař(ů)")

    for z in zaznamy:
        print(f"    {z['kod_odbornosti']}: {z['nazev_lekare']} / {z['nazev_zzz']}"
              f"  [{z['datum_zahajeni']} – {z['datum_ukonceni']}]")

    if not zaznamy:
        print(f"    (žádný lékař v žádné odbornosti)")

    if TEST_MODE:
        continue

    with mysql.cursor() as cur:
        cur.execute("""
            INSERT INTO vzp_registrace_raw (rc, k_datu, raw_xml)
            VALUES (%s, %s, %s)
            ON DUPLICATE KEY UPDATE raw_xml=VALUES(raw_xml)
        """, (rc, TODAY, xml))

    with mysql.cursor() as cur:
        for z in zaznamy:
            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
                    prijmeni=VALUES(prijmeni), jmeno=VALUES(jmeno),
                    ma_lekare=VALUES(ma_lekare),
                    ICZ=VALUES(ICZ), ICP=VALUES(ICP),
                    nazev_lekare=VALUES(nazev_lekare), nazev_zzz=VALUES(nazev_zzz),
                    poj_kod=VALUES(poj_kod), poj_zkratka=VALUES(poj_zkratka),
                    datum_registrace=VALUES(datum_registrace),
                    datum_zahajeni=VALUES(datum_zahajeni),
                    datum_ukonceni=VALUES(datum_ukonceni),
                    stav_vyrizeni=VALUES(stav_vyrizeni)
            """, (
                rc, prijmeni, jmeno, TODAY, z["kod_odbornosti"], 1 if z["ma_lekare"] else 0,
                z["ICZ"], z["ICP"], z["nazev_lekare"], z["nazev_zzz"],
                z["poj_kod"], z["poj_zkratka"],
                z["datum_registrace"], z["datum_zahajeni"], z["datum_ukonceni"],
                z["stav_vyrizeni"],
            ))

print(f"\nHotovo. VZP dotazů: {call_count}")
if TEST_MODE:
    print("(TEST MODE — nic nebylo zapsáno do DB)")

mysql.close()
