"""test_import_merge.py – vloží přílohy do dekurzu daného dne.
Pokud dekurs pro daný den existuje → vloží přílohy NAHORU před stávající text.
Pokud neexistuje → vytvoří nový dekurs.
Spustit na Windows.
"""
import datetime, os, re, fdb
import funkce, funkce_ext

CESTA  = r'u:\\'
IDPAC  = 9742   # Buzalka Vladimír
DATUM  = datetime.date(2026, 3, 18)

SOUBORY = [
    {'souborname': '7309208104 2026-03-18 Buzalka, Vladimír [vyšetření] [ahoj Claude copy1].pdf',
     'prvnizavorka': 'vyšetření', 'druhazavorka': 'ahoj Claude copy1', 'datum': DATUM},
    {'souborname': '7309208104 2026-03-18 Buzalka, Vladimír [vyšetření] [ahoj Claude copy2].pdf',
     'prvnizavorka': 'vyšetření', 'druhazavorka': 'ahoj Claude copy2', 'datum': DATUM},
    {'souborname': '7309208104 2026-03-18 Buzalka, Vladimír [vyšetření] [ahoj Claude].pdf',
     'prvnizavorka': 'vyšetření', 'druhazavorka': 'ahoj Claude', 'datum': DATUM},
]

# ─────────────────────────────────────────────────────────────────────────────

def najdi_posledni_dekurs_dnes(conn, idpac, datum_vlozeni):
    """Najde POSLEDNÍ dekurs pacienta (jakýkoli datum) a vrátí (id, rtf)
    pouze pokud je ze stejného dne jako datum_vlozeni. Jinak vrátí None.

    Logika: zajímá nás jen poslední zápis – pokud je z dnešního dne,
    vložíme přílohy do něj. Pokud je starší, zakládáme nový dnešní záznam.
    """
    cur = conn.cursor()
    cur.execute("""
        SELECT FIRST 1 ID, DATUM, DEKURS FROM DEKURS
        WHERE IDPAC = ?
        ORDER BY ID DESC
    """, (idpac,))
    row = cur.fetchone()
    if row is None:
        return None
    dekurs_id, dekurs_datum, dekurs_rtf = row
    print(f"    Poslední dekurs: ID={dekurs_id}, datum={dekurs_datum}")
    if dekurs_datum == datum_vlozeni:
        print(f"    → shoduje se s dneškem ({datum_vlozeni}), budeme mergovat")
        return (dekurs_id, dekurs_rtf)
    else:
        print(f"    → jiný den ({dekurs_datum} ≠ {datum_vlozeni}), vytvoříme nový")
        return None


def merge_rtf_prepend(existing_rtf, new_bkm_list, new_body_pards, n_new):
    """Vloží nový obsah (přílohy) na ZAČÁTEK stávajícího dekurzu.

    existing_rtf  – stávající RTF string z DB
    new_bkm_list  – list stringů typu '"popis","Files:123",9'
    new_body_pards – RTF string: header \par + \pard řádky s odkazy
    n_new          – počet nových bkmkstart indexů (= počet souborů)
    """
    rtf = existing_rtf

    # 1. Posunout stávající bkmkstart/bkmkend indexy o n_new,
    #    aby nedošlo ke kolizi s našimi novými (0, 1, 2 …)
    rtf = re.sub(r'\\bkmkstart (\d+)',
                 lambda m: '\\bkmkstart ' + str(int(m.group(1)) + n_new), rtf)
    rtf = re.sub(r'\\bkmkend (\d+)',
                 lambda m: '\\bkmkend '   + str(int(m.group(1)) + n_new), rtf)

    # 2. Přidat naše bookmarky na ZAČÁTEK {\info{\bookmarks ...}}
    new_bkm_str = ';'.join(new_bkm_list)

    def merge_bkm(m):
        existing = m.group(1).strip()
        combined = new_bkm_str + (';' + existing if existing else '')
        return '{\\info{\\bookmarks ' + combined + '}}'

    if re.search(r'\{\\info\{\\bookmarks', rtf):
        rtf = re.sub(r'\{\\info\{\\bookmarks ([^}]*)\}\}', merge_bkm, rtf)
    else:
        # žádný {\info} blok – vložíme za \deflang...
        rtf = re.sub(r'(\\deflang\d+)',
                     r'\1{\\info{\\bookmarks ' + new_bkm_str + '}}', rtf, count=1)

    # 3. Vložit naše tělo před první \uc1\pard těla stávajícího dekurzu
    match = re.search(r'\\uc1\\pard', rtf)
    if match:
        pos = rtf.index(r'\uc1\pard', match.start())
        rtf = rtf[:pos] + new_body_pards + '\n' + rtf[pos:]
    else:
        # fallback – připojit před poslední }
        rtf = rtf.rstrip()
        if rtf.endswith('}'):
            rtf = rtf[:-1] + new_body_pards + '\n}'

    return rtf

# ─────────────────────────────────────────────────────────────────────────────

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

# ── Krok 1: vložit soubory do ext DB ─────────────────────────────────────────
bookmark_list = []
bookmarks_body = ''
cislo  = 9
poradi = 0

for s in SOUBORY:
    cesta_souboru = os.path.join(CESTA, s['souborname'])
    datumsouboru  = datetime.datetime.fromtimestamp(os.path.getmtime(cesta_souboru))

    print(f"\n>>> Zpracovávám: {s['souborname']}")
    fileid = funkce_ext.zapis_file_ext(
        vstupconnection=conn, idpac=IDPAC,
        cesta=CESTA, souborname=s['souborname'],
        prvnizavorka=s['prvnizavorka'],
        soubordate=s['datum'], souborfiledate=datumsouboru,
        poznamka=s['druhazavorka'],
    )
    print(f"    → FILES.ID = {fileid}")

    filenameforbookmark = (s['datum'].strftime('%Y-%m-%d') + ' '
                           + s['prvnizavorka'] + ': ' + s['druhazavorka'])
    bookmark_list.append('"' + filenameforbookmark + '","Files:' + str(fileid) + '",' + str(cislo))
    cislo += 7

    bookmarks_body += (r'\pard\s10{\*\bkmkstart ' + str(poradi) + r'}'
                       r'\plain\cs32\f0\ul\fs20\cf1 ' + filenameforbookmark
                       + r'{\*\bkmkend ' + str(poradi) + r'}\par')
    poradi += 1

# Tělo přílohy (záhlaví + odkaz řádky + prázdný řádek)
new_body = (r'\uc1\pard\s10\plain\cs20\f0\i\fs20 Vlo\'9een\'e9 p\'f8\'edlohy:\par' + '\n'
            + bookmarks_body + '\n'
            + r'\pard\s10\plain\cs15\f0\fs20 \par')

# ── Krok 2: existující dekurs pro tento den? ──────────────────────────────────
print(f"\n>>> Hledám poslední dekurs pro IDPAC={IDPAC}...")
existujici = najdi_posledni_dekurs_dnes(conn, IDPAC, DATUM)
cur = conn.cursor()
now = datetime.datetime.now()

if existujici:
    dekurs_id, existing_rtf = existujici
    print(f"\n>>> Nalezen existující dekurs pro {DATUM}: ID={dekurs_id}")
    print(">>> Vkládám přílohy na začátek...")

    merged_rtf = merge_rtf_prepend(existing_rtf, bookmark_list, new_body, len(SOUBORY))

    print("\n=== Výsledný RTF ===")
    print(merged_rtf)

    cur.execute("UPDATE DEKURS SET DEKURS = ? WHERE ID = ?", (merged_rtf, dekurs_id))
    conn.commit()
    print(f"\n>>> UPDATE DEKURS ID={dekurs_id} – hotovo!")

else:
    print(f"\n>>> Žádný dekurs pro {DATUM} nenalezen – vytvářím nový...")

    bookmark_str = ';'.join(bookmark_list)
    rtf = r"""{\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029{\info{\bookmarks BOOKMARKNAMES}}{\fonttbl{\f0\fnil\fcharset238 Arial;}{\f5\fnil\fcharset238 Symbol;}}
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;\red0\green0\blue0;}
{\stylesheet{\s10\fi0\li0\ql\ri0\sb0\sa0 Vlevo;}{\*\cs15\f0\fs20 Norm\'e1ln\'ed;}{\*\cs20\f0\i\fs20 Z\'e1hlav\'ed;}{\*\cs32\f0\ul\fs20\cf1 Odkaz;}}
BOOKMARKSTEXT
\pard\s10\plain\cs15\f0\fs20 \par
}"""
    rtf = rtf.replace('BOOKMARKNAMES', bookmark_str)
    rtf = rtf.replace('BOOKMARKSTEXT', new_body)

    print("\n=== Výsledný RTF ===")
    print(rtf)

    dekursid = funkce.get_dekurs_id(conn)
    cur.execute(
        "INSERT INTO DEKURS (id, iduzi, idprac, idodd, idpac, datum, cas, dekurs)"
        " VALUES (?,?,?,?,?,?,?,?)",
        (dekursid, 6, 2, 2, IDPAC, now.date(), now.time(), rtf)
    )
    conn.commit()
    print(f"\n>>> Nový DEKURS ID={dekursid}")

conn.close()
print("\n=== HOTOVO ===")
print("Otevři Medicus → karta Buzalka → zkontroluj dekurs!")
