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

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

- změna definována jako přechod 1 → X
- zdroj změn: MySQL (vzp_stav_pojisteni)
- filtr pacientů: Medicus (aktivně registrovaní)
- email se odešle pouze pokud existuje alespoň 1 změna
"""

import sys
from pathlib import Path
import pymysql

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

from knihovny.medicus_db import MedicusDB
from knihovny.EmailMessagingGraph import send_mail

# ==========================================
# 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"

# ==========================================
# EMAIL CONFIG
# ==========================================
EMAIL_TO = "vladimir.buzalka@buzalka.cz"   # ← sem případně uprav adresu
EMAIL_SUBJECT = "VZP – změna pojištění u registrovaných pacientů"

# ==========================================
# SQL – ZMĚNA 1 → X (HISTORIE)
# ==========================================
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️⃣ Registrovaní pacienti (Medicus)
    db = MedicusDB(HOST, DB_PATH)
    registered = db.get_active_registered_patients()
    db.close()

    registered_rc = {rc for rc, *_ in registered}

    # 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]

    # 4️⃣ Pokud není co hlásit → konec
    if not filtered:
        print("Žádná změna pojištění u registrovaných pacientů – e-mail se neposílá.")
        return

    # 5️⃣ Sestavení reportu (TEXT)
    lines = []
    lines.append("Změna stavu pojištění u registrovaných pacientů:\n")

    for r in filtered:
        pacient = f"{r['prijmeni']} {r['jmeno']}".strip()
        lines.append(
            f"- pacient {pacient}, "
            f"současný stav \"{r['current_stav']}\", "
            f"změna dne {r['change_date']} (ze \"1\" na \"{r['change_stav']}\")"
        )

    body = "\n".join(lines)

    # 6️⃣ Odeslání e-mailu
    send_mail(
        to=EMAIL_TO,
        subject=f"{EMAIL_SUBJECT} ({len(filtered)})",
        body=body,
        html=False,
    )

    print(f"Odeslán e-mail: {len(filtered)} pacientů")

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