"""
Vytvoří tabulky recept_doklad a recept_plp v MySQL databázi medicus.

Spuštění:
    python 09_VytvorTabulky.py

Tabulky:
    recept_doklad  — jeden řádek na celý recept (ID_Dokladu)
    recept_plp     — jeden řádek na PLP položku (id_lp = predpis.id_lp_predpis)

Bezpečné opakované spuštění — používá CREATE TABLE IF NOT EXISTS.
Neprovádí DROP.
"""

import pymysql
import pymysql.cursors

DB = dict(
    host        = "192.168.1.76",
    user        = "root",
    password    = "Vlado9674+",
    database    = "medicus",
    charset     = "utf8mb4",
    cursorclass = pymysql.cursors.DictCursor,
)

DDL = [

    # ── recept_doklad ─────────────────────────────────────────────────────────
    # Jeden řádek na celý recept (ID_Dokladu = ERP kód, např. PPIBVF93285E).
    # Data na úrovni dokladu: stav, platnost, pacient snapshot, předepisující.
    #
    # stav_terminal:
    #   0 = PREDEPSANY nebo CASTECNE_VYDANY → skript má znovu stahovat XML
    #   1 = PLNE_VYDANY nebo ZRUSENY nebo expirovaný → stahování ukončeno
    #
    # xml_soubor: relativní cesta k poslednímu naparsovanému XML souboru
    """
    CREATE TABLE IF NOT EXISTS recept_doklad (
        id_dokladu          VARCHAR(20)     NOT NULL PRIMARY KEY,

        -- stav a platnost
        stav                ENUM(
                                'PREDEPSANY',
                                'CASTECNE_VYDANY',
                                'PLNE_VYDANY',
                                'ZRUSENY'
                            )               NOT NULL,
        stav_terminal       TINYINT(1)      NOT NULL DEFAULT 0
                            COMMENT '1 = nepotřebuje další stahování',
        datum_vystaveni     DATE            NOT NULL,
        platnost_do         DATE,
        vypis_do            DATE            COMMENT 'prodloužení platnosti výpisem',
        akutni              TINYINT(1),
        rodina              TINYINT(1)      COMMENT 'ad usum proprium',
        opakovani           INT             COMMENT 'NULL = není opakovací',
        druh_pojisteni      ENUM('VEREJNE','OSTATNI'),
        modry_pruh          TINYINT(1),
        pozn                VARCHAR(1000),
        zap_doplatek        DECIMAL(10,2)   COMMENT 'ZapocitatelnyDoplatekZbyvaDoLimitu',

        -- časové razítko z eReceptu
        zalozeni            DATETIME,
        zmena               DATETIME,

        -- předepisující lékař (FK na existující tabulku z lékového záznamu)
        lekar_kod           CHAR(36),
        odbornost_kod       VARCHAR(10),
        odbornost_nazev     VARCHAR(100),
        lekar_email         VARCHAR(100),

        -- pacient snapshot (hodnoty platné k datu předpisu — mohou se měnit)
        cp                  VARCHAR(10)     COMMENT 'číslo pojištěnce / RČ',
        zp_kod              CHAR(3),
        zp_nazev            VARCHAR(100),
        pac_telefon         VARCHAR(20),
        pac_notifikace      ENUM('SMS','EMAIL'),
        pac_pohlavi         ENUM('M','Z'),

        -- meta
        xml_soubor          VARCHAR(255)    COMMENT 'cesta k poslednímu XML souboru',
        stazeno             DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                            COMMENT 'poslední aktualizace záznamu',

        FOREIGN KEY (lekar_kod) REFERENCES predepisujici (lekar_kod)
            ON DELETE SET NULL,

        INDEX idx_stav          (stav),
        INDEX idx_stav_terminal (stav_terminal),
        INDEX idx_platnost      (platnost_do),
        INDEX idx_lekar         (lekar_kod)
    ) ENGINE=InnoDB COMMENT='Detail receptu (NacistPredpis) — jeden řádek na ID_Dokladu'
    """,

    # ── recept_plp ────────────────────────────────────────────────────────────
    # Jeden řádek na PLP položku (jeden lék na receptu).
    # id_lp = UUID = predpis.id_lp_predpis  → přímý JOIN s lékovým záznamem.
    # Lékové detaily (ATC, název, forma…) jsou záměrně vynechány —
    # jsou už v tabulce predpis, duplikovat je nemá smysl.
    """
    CREATE TABLE IF NOT EXISTS recept_plp (
        id_lp               CHAR(36)        NOT NULL PRIMARY KEY
                            COMMENT 'UUID PLP = predpis.id_lp_predpis',
        id_dokladu          VARCHAR(20)     NOT NULL,

        uhrada              VARCHAR(20),
        prekroceni          TINYINT(1),

        FOREIGN KEY (id_dokladu) REFERENCES recept_doklad (id_dokladu)
            ON DELETE CASCADE,

        INDEX idx_id_dokladu (id_dokladu)
    ) ENGINE=InnoDB COMMENT='PLP položky receptu — JOIN přes id_lp na predpis.id_lp_predpis'
    """,
]


def vytvor_tabulky():
    conn = pymysql.connect(**DB)
    try:
        with conn.cursor() as cur:
            for ddl in DDL:
                tabulka = ddl.strip().split()[5]   # CREATE TABLE IF NOT EXISTS <name>
                cur.execute(ddl)
                print(f"  OK  {tabulka}")
        conn.commit()
        print("\nHotovo.")
    finally:
        conn.close()


if __name__ == "__main__":
    vytvor_tabulky()
