#!/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")
"""
02_import_do_db.py
==================
Vytvoří tabulku seznam_pojistencu_davky v medevio DB a naimportuje
všechny dávky F111*.nnn ze složky Podání.

Spuštění:
    python 02_import_do_db.py           # import všech dávek
    python 02_import_do_db.py --reset   # smaže a znovu vytvoří tabulku před importem
"""

import re
import sys
import argparse
from pathlib import Path
from datetime import date

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

DAVKY_DIR = Path(r"U:\Dropbox\Ordinace\Dokumentace_ke_zpracování\Zúčtovací zprávy\111 VZP Podání")
ENCODING  = "cp852"

CREATE_SQL = """
CREATE TABLE IF NOT EXISTS seznam_pojistencu_davky (
    id            INT           NOT NULL AUTO_INCREMENT PRIMARY KEY,
    soubor        VARCHAR(60)   NOT NULL COMMENT 'Název souboru dávky',
    icp           VARCHAR(8)    NOT NULL COMMENT 'IČP lékaře (HICP)',
    davka_rok     SMALLINT      NOT NULL COMMENT 'Rok dávky (HROK)',
    davka_mesic   TINYINT       NOT NULL COMMENT 'Měsíc dávky (HMES)',
    davka_den     TINYINT       NOT NULL COMMENT 'Den pořízení seznamu (HDEN)',
    por           SMALLINT      NOT NULL COMMENT 'Pořadové číslo v dávce (IPOR)',
    vs            VARCHAR(2)    NOT NULL COMMENT 'Věková skupina (IVS)',
    prijmeni      VARCHAR(30)   NOT NULL COMMENT 'Příjmení pojištěnce (IPRI)',
    jmeno         VARCHAR(24)   NOT NULL COMMENT 'Jméno pojištěnce (IJME)',
    cip           VARCHAR(10)   NOT NULL COMMENT 'Číslo pojištěnce (ICIP)',
    datum_od      DATE              NULL COMMENT 'Datum uznání registrace (IDUOD)',
    pojistovna    VARCHAR(3)    NOT NULL COMMENT 'Kód pojišťovny (ICPO)',
    vytvoreno     TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_soubor_por (soubor, por)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci
  COMMENT='VZP seznam registrovaných pojištěnců III-1.1.2';
"""


def parse_davku(path: Path) -> dict:
    lines = path.read_bytes().splitlines()
    hlavicka  = None
    pojistenci = []

    for raw in lines:
        line = raw.decode(ENCODING, errors="replace")
        if not line:
            continue

        if line[0] == "H":
            hlavicka = {
                "icp":    line[1:9].strip(),
                "pocet":  int(line[9:14].strip() or 0),
                "rok":    2000 + int(line[14:16]),
                "mesic":  int(line[16:18]),
                "den":    int(line[18:20]),
            }

        elif line[0] == "I":
            if len(line) < 82:
                continue
            dat_raw = line[71:79]   # DDMMRRRR
            try:
                datum = date(int(dat_raw[4:8]), int(dat_raw[2:4]), int(dat_raw[0:2]))
            except ValueError:
                datum = None

            pojistenci.append({
                "por":        int(line[1:5].strip() or 0),
                "vs":         line[5:7].strip(),
                "prijmeni":   line[7:37].strip(),
                "jmeno":      line[37:61].strip(),
                "cip":        line[61:71].strip(),
                "datum_od":   datum,
                "pojistovna": line[79:82].strip(),
            })

    return {"hlavicka": hlavicka, "pojistenci": pojistenci, "soubor": path.name}


def najdi_davky(adresar: Path) -> list[Path]:
    return sorted(
        [p for p in adresar.iterdir()
         if re.search(r"F\d{3}.*\.\d{3}$", p.name, re.IGNORECASE)],
        key=lambda p: p.name
    )


def import_davku(cur, davka: dict) -> tuple[int, int]:
    """Vrátí (vloženo, přeskočeno duplicit)."""
    h = davka["hlavicka"]
    if not h:
        print(f"  SKIP {davka['soubor']} — chybí záhlaví")
        return 0, 0

    rows = [
        (davka["soubor"], h["icp"], h["rok"], h["mesic"], h["den"],
         p["por"], p["vs"], p["prijmeni"], p["jmeno"],
         p["cip"], p["datum_od"], p["pojistovna"])
        for p in davka["pojistenci"]
    ]

    # INSERT IGNORE přeskočí duplicity (unikátní klíč soubor+por) bez chyby
    affected = cur.executemany(
        """INSERT IGNORE INTO seznam_pojistencu_davky
           (soubor, icp, davka_rok, davka_mesic, davka_den,
            por, vs, prijmeni, jmeno, cip, datum_od, pojistovna)
           VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
        rows
    )
    vlozeno    = affected if affected else 0
    preskoceno = len(rows) - vlozeno
    return vlozeno, preskoceno


# ── MAIN ──────────────────────────────────────────────────────────────────────

parser = argparse.ArgumentParser(description="Import VZP dávek do MySQL")
parser.add_argument("--reset", action="store_true",
                    help="Smaže a znovu vytvoří tabulku před importem")
args = parser.parse_args()

conn = connect_mysql()
cur  = conn.cursor()

if args.reset:
    print("DROP TABLE seznam_pojistencu_davky ...")
    cur.execute("DROP TABLE IF EXISTS seznam_pojistencu_davky")

print("Vytváření tabulky (pokud neexistuje) ...")
cur.execute(CREATE_SQL)

davky = najdi_davky(DAVKY_DIR)
print(f"Nalezeno dávek: {len(davky)}\n")

celkem_vlozeno = celkem_preskoceno = 0

for cesta in davky:
    davka = parse_davku(cesta)
    h = davka["hlavicka"]
    if h:
        print(f"{davka['soubor']}  ({h['den']:02d}.{h['mesic']:02d}.{h['rok']}, {len(davka['pojistenci'])} záznamů)")
    else:
        print(f"{davka['soubor']}  (záhlaví chybí)")

    vlozeno, preskoceno = import_davku(cur, davka)
    celkem_vlozeno    += vlozeno
    celkem_preskoceno += preskoceno
    print(f"  → vloženo: {vlozeno}, duplicit přeskočeno: {preskoceno}")

cur.close()
conn.close()

print(f"\nHotovo. Celkem vloženo: {celkem_vlozeno}, přeskočeno: {celkem_preskoceno}")
