"""s04_presun_externi_db.py – Přesun externích DB souborů z u:\ do u:\externi\

Spustit na Windows s ZAVŘENÝM Medicusem!

Co dělá:
  1. Připojí se k hlavní medicus.fdb
  2. Načte všechny záznamy z EXTERNI_DB
  3. Pro každý záznam zkopíruje FDB soubor z původní lokace do u:\externi\
  4. Aktualizuje EXTERNI_DB.PATH na novou lokaci
  5. Vytiskne přehled výsledků

Po spuštění zkus v Medicusu otevřít přílohu pacienta – mělo by to fungovat.
Pokud ne, zálohuj si databázi a spusť znovu (skript je idempotentní).
"""

import os
import shutil
import fdb

# ── Konfigurace ──────────────────────────────────────────────────────────────
MAIN_DB   = r'c:\medicus 3\data\medicus.fdb'
CÍL_SLOŽKA = r'u:\externi'
# ─────────────────────────────────────────────────────────────────────────────

def main():
    os.makedirs(CÍL_SLOŽKA, exist_ok=True)
    print(f"Cílová složka: {CÍL_SLOŽKA}")
    print()

    print("Připojuji se k hlavní DB...")
    conn = fdb.connect(
        dsn=f'localhost:{MAIN_DB}',
        user='SYSDBA',
        password='masterkey',
        charset='WIN1250'
    )
    cur = conn.cursor()

    # Načti všechny záznamy z EXTERNI_DB
    cur.execute("SELECT DBNAME, SERVER, PATH, HESLO FROM EXTERNI_DB ORDER BY DBNAME")
    zaznamy = cur.fetchall()
    print(f"Nalezeno {len(zaznamy)} záznamů v EXTERNI_DB:")
    print()

    ok = 0
    preskoceno = 0
    chyba = 0

    for dbname, server, path_puvodni, heslo in zaznamy:
        print(f"  [{dbname}]  {path_puvodni}")

        # Název souboru (jen basename, bez cesty)
        basename = os.path.basename(path_puvodni)
        # Normalize: Medicus někdy ukládá s malým .fdb, někdy velkým .FDB
        path_cil = os.path.join(CÍL_SLOŽKA, basename)

        # Zkontroluj, jestli zdrojový soubor existuje
        # (zkus obě varianty přípony)
        path_src = None
        for kandidat in [path_puvodni,
                         path_puvodni.replace('.fdb', '.FDB'),
                         path_puvodni.replace('.FDB', '.fdb')]:
            if os.path.isfile(kandidat):
                path_src = kandidat
                break

        if path_src is None:
            print(f"    ⚠ ZDROJOVÝ SOUBOR NENALEZEN: {path_puvodni} – přeskakuji")
            chyba += 1
            continue

        # Pokud je soubor už v cíli, přeskoč kopírování
        if os.path.isfile(path_cil):
            velikost = os.path.getsize(path_cil)
            print(f"    → Soubor již existuje v cíli ({velikost:,} B), přeskakuji kopírování")
        else:
            velikost = os.path.getsize(path_src)
            print(f"    → Kopíruji ({velikost:,} B)...", end=' ', flush=True)
            shutil.copy2(path_src, path_cil)
            print("OK")

        # Aktualizuj PATH v EXTERNI_DB pokud se liší
        if path_puvodni != path_cil:
            cur.execute(
                "UPDATE EXTERNI_DB SET PATH = ? WHERE DBNAME = ?",
                (path_cil, dbname)
            )
            print(f"    → EXTERNI_DB.PATH aktualizováno: {path_cil}")
        else:
            print(f"    → PATH již ukazuje na cíl, není třeba měnit")
            preskoceno += 1

        ok += 1

    conn.commit()
    conn.close()

    print()
    print("=" * 60)
    print(f"Hotovo! Zpracováno: {ok}, přeskočeno: {preskoceno}, chyb: {chyba}")
    print()
    if chyba > 0:
        print("⚠ Některé soubory nebyly nalezeny – viz výpis výše.")
        print("  Pokud jsou to staré DB které již neexistují, nevadí to.")
    print("Nyní spusť Medicus a zkus otevřít přílohu pacienta.")

if __name__ == '__main__':
    main()
