"""
Stahování seznamu registrovaných pojištěnců ČPZP.

Použij po 01_prihlaseni.py (ten uloží cpzp_cookies.json).

Co dělá:
  - Načte cookies z cpzp_cookies.json
  - Otevře prohlížeč jednou, projde všechny zadané měsíce
  - Pro každý měsíc vyplní formulář, klikne Hledat, stáhne soubor
  - Přeskočí měsíce kde soubor v cílovém adresáři už existuje
  - Uloží jako: YYYY-MM-DD f205MMRR.123

NASTAVENÍ:
  OD_MESIC / OD_ROK  — první měsíc rozsahu
  DO_MESIC / DO_ROK  — poslední měsíc rozsahu (včetně)
"""

import glob
import json
import os
import sys
import time
from datetime import date

from playwright.sync_api import sync_playwright

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", ".."))
from Knihovny.najdi_dropbox import get_dropbox_root

OD_MESIC = 12
OD_ROK   = 2024
DO_MESIC = 3
DO_ROK   = 2026

BASE_URL     = "https://portal.cpzp.cz"
COOKIES_FILE = os.path.join(os.path.dirname(__file__), "..", "..", "StahováníZpráv", "205 ČPZP", "cpzp_cookies.json")
DEST_DIR     = os.path.join(
    get_dropbox_root(),
    "Ordinace", "Dokumentace_ke_zpracování", "Zúčtovací zprávy", "205 ČPZP",
)


def mesice_v_rozsahu(od_m, od_r, do_m, do_r):
    """Generuje (mesic, rok) od od_m/od_r do do_m/do_r včetně."""
    m, r = od_m, od_r
    while (r, m) <= (do_r, do_m):
        yield m, r
        m += 1
        if m > 12:
            m = 1
            r += 1


def uz_stazeno(mesic: int, rok: int) -> bool:
    """Vrátí True pokud soubor pro daný měsíc/rok už existuje v DEST_DIR."""
    mm = f"{mesic:02d}"
    rr = str(rok)[-2:]
    pattern = os.path.join(DEST_DIR, f"* f205{mm}{rr}.*")
    return bool(glob.glob(pattern))


def stahni_mesic(page, mesic: int, rok: int) -> bool:
    """Stáhne soubor pro jeden měsíc. Vrátí True pokud staženo."""
    today = date.today().strftime("%Y-%m-%d")

    if uz_stazeno(mesic, rok):
        print(f"  [{mesic:02d}/{rok}] přeskočeno — soubor už existuje")
        return False

    # Vyplň formulář
    inputs = page.query_selector_all("input[type=text]")
    if len(inputs) < 2:
        print(f"  [{mesic:02d}/{rok}] CHYBA — inputy nenalezeny")
        return False

    inputs[0].fill(str(mesic))
    inputs[1].fill(str(rok))

    page.get_by_text("Hledat", exact=True).click()
    page.wait_for_load_state("networkidle")

    dl_selector = "a:has-text('Seznam registrovaných pojištěnců')"
    if not page.query_selector(dl_selector):
        print(f"  [{mesic:02d}/{rok}] CHYBA — download odkaz nenalezen")
        return False

    with page.expect_download() as dl_info:
        page.click(dl_selector)
    download = dl_info.value

    original_name = download.suggested_filename
    dest_path = os.path.join(DEST_DIR, f"{today} {original_name}")
    download.save_as(dest_path)
    print(f"  [{mesic:02d}/{rok}] OK — {os.path.basename(dest_path)}")
    return True


def hlavni() -> None:
    if not os.path.exists(COOKIES_FILE):
        raise SystemExit(f"Soubor s cookies nenalezen: {COOKIES_FILE}\nNejdřív spusť 01_prihlaseni.py")

    with open(COOKIES_FILE, encoding="utf-8") as f:
        cookies = json.load(f)

    os.makedirs(DEST_DIR, exist_ok=True)

    mesice = list(mesice_v_rozsahu(OD_MESIC, OD_ROK, DO_MESIC, DO_ROK))
    print(f"Celkem měsíců: {len(mesice)}  ({OD_MESIC:02d}/{OD_ROK} – {DO_MESIC:02d}/{DO_ROK})")

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        context.add_cookies(cookies)
        page = context.new_page()

        print("Otevírám stránku klientely...")
        page.goto(f"{BASE_URL}/app/prohlizeni-klientely/")
        page.wait_for_load_state("networkidle")

        if "frmPrihlasCert" in page.content():
            raise SystemExit("Cookies expirovala — nejdřív spusť 01_prihlaseni.py")

        stazeno = 0
        for mesic, rok in mesice:
            if stahni_mesic(page, mesic, rok):
                stazeno += 1
                time.sleep(2)

        browser.close()

    print(f"\nHotovo: {stazeno} staženo, {len(mesice) - stazeno} přeskočeno.")


if __name__ == "__main__":
    hlavni()
