"""
Najde datum poslední preventivní prohlídky (výkon 01022 nebo 01021)
pro každého registrovaného pacienta z VZPARC DRUH=98 (výkonové dávky pojišťovnám).
Výsledek zapíše do KAR.POZNAMKA ve formátu:
  [[prev_prohlidka:YYYY-MM-DD 01022, YYYY-MM-DD]]
kde první datum je datum PP a druhé je nejdřívější možný termín příští (23 měsíců).
"""

import fdb
import re
import sys
from datetime import date
from dateutil.relativedelta import relativedelta

sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1)

KODY_PP = {'01022', '01021'}

conn = fdb.connect(
    dsn=r'localhost:c:\medicus 3\data\medicus.fdb',
    user='SYSDBA', password='masterkey', charset='win1250'
)
cur = conn.cursor()

# --- 1. Načti registrované pacienty (RC → IDPAC, aktuální POZNAMKA) ---
dnes = date.today().strftime('%Y-%m-%d')
cur.execute(f"""
    SELECT KAR.IDPAC, KAR.RODCIS, KAR.PRIJMENI, KAR.JMENO, KAR.POZNAMKA
    FROM KAR
    WHERE KAR.VYRAZEN = 'N'
    AND EXISTS (
        SELECT r.ID FROM REGISTR r
        JOIN ICP i ON r.IDICP = i.IDICP
        WHERE r.IDPAC = KAR.IDPAC
          AND r.DATUM <= '{dnes}'
          AND (r.DATUM_ZRUSENI IS NULL OR r.DATUM_ZRUSENI >= '{dnes}')
          AND r.PRIZNAK IN ('V','D','A')
          AND i.ICP = '09305001'
          AND i.ODB = '001'
    )
""")
pacienti = {}   # RODCIS -> {'idpac', 'prijmeni', 'jmeno', 'poznamka'}
for row in cur.fetchall():
    idpac, rodcis, prijmeni, jmeno, poznamka = row
    if rodcis:
        pacienti[rodcis.strip()] = {
            'idpac': idpac,
            'prijmeni': prijmeni,
            'jmeno': jmeno,
            'poznamka': poznamka or '',
        }
print(f"Registrovaných pacientů: {len(pacienti)}")

# --- 2. Projdi všechny VZPARC DRUH=98 dávky a hledej výkony 01022/01021 ---
# Výsledek: RC -> (nejnovejsi_datum, kod)
vysledky = {}   # RC -> (nejnovejsi_datum, kod)

cur.execute("""
    SELECT DAVKA FROM VZPARC
    WHERE DRUH = '98' AND DAVKA IS NOT NULL
""")

davky = cur.fetchall()
print(f"VZPARC DRUH=98 blobů celkem: {len(davky)}")

for (kdavka_raw,) in davky:
    if not kdavka_raw:
        continue
    # Dekódování CP852
    try:
        text = kdavka_raw.encode('cp1250', errors='replace').decode('cp852', errors='replace')
    except Exception:
        continue

    if not text.startswith('DP98'):
        continue

    aktualni_rc = None
    for line in text.splitlines():
        if not line:
            continue
        typ = line[0]

        if typ == 'A':
            # RC je na pevné pozici 34, délka 10
            if len(line) >= 44:
                aktualni_rc = line[34:44].strip()
            else:
                aktualni_rc = None

        elif typ == 'V' and aktualni_rc:
            # V + DDMMYYYY + KOD(5)
            if len(line) < 14:
                continue
            try:
                dd = int(line[1:3])
                mm = int(line[3:5])
                yyyy = int(line[5:9])
                kod = line[9:14].strip()
            except (ValueError, IndexError):
                continue

            if kod not in KODY_PP:
                continue

            try:
                datum = date(yyyy, mm, dd)
            except ValueError:
                continue

            # Ulož jen nejnovější datum
            if aktualni_rc not in vysledky or datum > vysledky[aktualni_rc][0]:
                vysledky[aktualni_rc] = (datum, kod)

print(f"Pacientů s nalezenou PP (01022/01021): {len(vysledky)}")

# --- 3. Zapiš do KAR.POZNAMKA ---
TAG_RE = re.compile(r'\[\[prev_prohlidka:[^\]]*\]\]\s*#zaps[^#]*#')
TAG_FORMAT = '[[prev_prohlidka:{pp_datum} {kod}, {pristi_datum}]] #zapsáno {zapsano}#'

zapsano = 0
preskoceno = 0
nenalezeno = 0

from datetime import datetime
ted = datetime.now().strftime('%d-%m-%Y %H:%M')

for rc, (datum_pp, kod) in sorted(vysledky.items()):
    if rc not in pacienti:
        nenalezeno += 1
        continue

    pac = pacienti[rc]
    pristi = datum_pp + relativedelta(months=23)
    tag = TAG_FORMAT.format(
        pp_datum=datum_pp.strftime('%d-%m-%Y'),
        kod=kod,
        pristi_datum=pristi.strftime('%d-%m-%Y'),
        zapsano=ted,
    )

    stara = pac['poznamka']
    # Odstraň starý tag a vlož nový na začátek
    nova = TAG_RE.sub('', stara).lstrip('\n')
    nova = tag + ('\n' + nova if nova else '')

    cur.execute(
        "UPDATE KAR SET POZNAMKA=? WHERE IDPAC=?",
        (nova, pac['idpac'])
    )
    zapsano += 1

conn.commit()
print(f"Zapsáno: {zapsano}, nenalezeno v KAR: {nenalezeno}, přeskočeno: {preskoceno}")
conn.close()
