import mysql.connector
import sys

# --- KONFIGURACE ---
db_config = {
    'host': '192.168.1.76',
    'port': 3307,
    'user': 'root',
    'password': 'Vlado9674+',
    'database': 'ordinace'
}


def transform_archive_to_results():
    # Vynucený výpis hned na začátku
    print(">>> Startuji proces transformace...", flush=True)

    try:
        print("Navazuji spojení s MySQL serverem (port 3307)...", flush=True)
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor(dictionary=True)
        print("Spojení navázáno.", flush=True)

        # 1. KROK: VYMAZÁNÍ CÍLOVÝCH TABULEK
        print("Mažu stará data z tabulek: vykony, leciva, doklady...", flush=True)
        # Mažeme v pořadí od dětí k rodičům kvůli integritě
        cursor.execute("DELETE FROM vykony")
        cursor.execute("DELETE FROM leciva")
        cursor.execute("DELETE FROM doklady")
        conn.commit()
        print("Tabulky jsou prázdné.", flush=True)

        # 2. KROK: PARSOVÁNÍ DOKLADŮ (Věty A)
        print("Načítám věty typu A z archivu (vety)...", flush=True)
        cursor.execute("SELECT id_vety, id_davky, obsah_radku FROM vety WHERE typ_vety = 'A'")
        a_vety_raw = cursor.fetchall()

        mapping_veta_to_doklad = {}
        insert_a_sql = """
            INSERT INTO doklady (id_davky, pojistovna, icp, odbornost, cislo_poradove, rodne_cislo, diagnoza) 
            VALUES (%s, %s, %s, %s, %s, %s, %s)
        """

        for row in a_vety_raw:
            s = row['obsah_radku']
            # Extrakce dat dle specifikace
            vals = (
                row['id_davky'],
                s[13:16].strip(),  # HCPO - Pojišťovna
                s[17:25].strip(),  # HICO - IČP
                s[31:34].strip(),  # HODB - Odbornost
                s[1:8].strip(),  # HCID - Číslo dokladu
                s[34:44].strip(),  # HROD - Číslo pojištěnce (RČ)
                s[44:49].strip()  # HZDG - Diagnóza
            )
            cursor.execute(insert_a_sql, vals)
            mapping_veta_to_doklad[row['id_vety']] = cursor.lastrowid

        conn.commit()
        print(f"Úspěšně zpracováno {len(a_vety_raw)} dokladů.", flush=True)

        # 3. KROK: PARSOVÁNÍ VÝKONŮ (Věty V)
        print("Provazuji a vkládám výkony (V)...", flush=True)
        cursor.execute("SELECT id_dokladu_vazba, obsah_radku FROM vety WHERE typ_vety = 'V'")
        v_vety_raw = cursor.fetchall()

        v_bulk_data = []
        for row in v_vety_raw:
            v = row['obsah_radku']
            vazba_a = row['id_dokladu_vazba']

            if vazba_a in mapping_veta_to_doklad:
                d = v[1:9]  # VDAT (Datum DDMMYYYY)
                datum_sql = f"{d[4:8]}-{d[2:4]}-{d[0:2]}"

                # Body VBOD (pozice 23, délka 7)
                body_val = v[23:30].strip()
                body = int(body_val) if body_val.isdigit() else 0

                v_bulk_data.append((
                    mapping_veta_to_doklad[vazba_a],  # id_dokladu (nový PK)
                    datum_sql,  # datum_vykonu
                    v[9:14].strip(),  # VKOD - Kód výkonu
                    int(v[14:15]) if v[14:15].isdigit() else 1,  # VPOC - Počet
                    v[15:18].strip(),  # VODB - Odbornost
                    v[18:23].strip(),  # VDIA - Diagnóza
                    body  # body
                ))

        if v_bulk_data:
            insert_v_sql = """
                INSERT INTO vykony (id_dokladu, datum_vykonu, kod_vykonu, pocet, odbornost, diagnoza, body) 
                VALUES (%s, %s, %s, %s, %s, %s, %s)
            """
            cursor.executemany(insert_v_sql, v_bulk_data)
            conn.commit()
            print(f"Hromadně vloženo {len(v_bulk_data)} výkonů.", flush=True)

        print("-" * 30, flush=True)
        print("Transformace dokončena.", flush=True)

    except mysql.connector.Error as err:
        print(f"Chyba databáze: {err}", flush=True)
    except Exception as e:
        print(f"Neočekávaná chyba: {e}", flush=True)
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()


if __name__ == "__main__":
    transform_archive_to_results()