#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
REPORT – ZMĚNA STAVU POJIŠTĚNÍ (POUZE REGISTROVANÍ PACIENTI)

Výstup:
pacient XY, současný stav pojištění je "X",
ke změně došlo dne YYYY-MM-DD (ze "1" na "X")

Zdroj:
- změna stavu: MySQL (vzp_stav_pojisteni)
- filtr pacientů: Medicus (aktivně registrovaní)
"""

import sys
from pathlib import Path
import pymysql

# ==========================================
# PROJECT ROOT
# ==========================================
PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(PROJECT_ROOT))

from knihovny.medicus_db import MedicusDB

# ==========================================
# MYSQL CONFIG
# ==========================================
MYSQL_CONFIG = {
    "host": "192.168.1.76",
    "port": 3307,
    "user": "root",
    "password": "Vlado9674+",
    "database": "medevio",
    "charset": "utf8mb4",
    "cursorclass": pymysql.cursors.DictCursor,
}

# ==========================================
# MEDICUS CONFIG
# ==========================================
HOST = "192.168.1.4"
DB_PATH = r"z:\Medicus 3\data\MEDICUS.FDB"

# ==========================================
# SQL – ZMĚNY 1 → X (BEZ OHLEDU NA REGISTRACI)
# ==========================================
SQL = """
SELECT
    cur.rc,
    cur.prijmeni,
    cur.jmeno,
    cur.stav AS current_stav,
    chg.k_datu AS change_date,
    chg.stav AS change_stav
FROM
    (
        SELECT p1.*
        FROM vzp_stav_pojisteni p1
        JOIN (
            SELECT rc, MAX(k_datu) AS max_date
            FROM vzp_stav_pojisteni
            GROUP BY rc
        ) x
          ON x.rc = p1.rc
         AND x.max_date = p1.k_datu
        WHERE p1.stav <> '1'
    ) cur
JOIN
    (
        SELECT rc, MAX(k_datu) AS last_ok
        FROM vzp_stav_pojisteni
        WHERE stav = '1'
        GROUP BY rc
    ) ok
      ON ok.rc = cur.rc
JOIN
    vzp_stav_pojisteni chg
      ON chg.id = (
            SELECT MIN(id)
            FROM vzp_stav_pojisteni z
            WHERE z.rc = cur.rc
              AND z.k_datu = (
                    SELECT MIN(k_datu)
                    FROM vzp_stav_pojisteni zz
                    WHERE zz.rc = cur.rc
                      AND zz.k_datu > ok.last_ok
                )
        )
ORDER BY cur.prijmeni, cur.jmeno;
"""

# ==========================================
# MAIN
# ==========================================
def main():

    # 1️⃣ Načíst aktivně registrované pacienty z Medicusu
    db = MedicusDB(HOST, DB_PATH)
    registered = db.get_active_registered_patients()
    db.close()

    # vytvoříme množinu RC (rychlé filtrování)
    registered_rc = {rc for rc, *_ in registered}

    print(f"Registrovaných pacientů: {len(registered_rc)}")

    # 2️⃣ Načíst změny z MySQL
    mysql = pymysql.connect(**MYSQL_CONFIG)

    with mysql.cursor() as cur:
        cur.execute(SQL)
        rows = cur.fetchall()

    mysql.close()

    # 3️⃣ Průnik množin
    filtered = [r for r in rows if r["rc"] in registered_rc]

    print(f"Změny pojištění (registrovaní): {len(filtered)}\n")

    # 4️⃣ Výpis reportu
    print("REPORT – ZMĚNA STAVU POJIŠTĚNÍ (REGISTROVANÍ)\n")

    for r in filtered:
        pacient = f"{r['prijmeni']} {r['jmeno']}".strip()
        print(
            f"pacient {pacient}, "
            f"současný stav pojištění je \"{r['current_stav']}\", "
            f"ke změně došlo dne {r['change_date']} "
            f"(ze \"1\" na \"{r['change_stav']}\")"
        )

    print("\nKONEC REPORTU.")

# ==========================================
if __name__ == "__main__":
    main()
