#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys as _sys
_sys.stdout.reconfigure(encoding="utf-8", errors="replace")
_sys.stderr.reconfigure(encoding="utf-8", errors="replace")
"""
03_porovnani_davek.py
=====================
Porovná všechny po sobě jdoucí dávky VZP a vytvoří Excel se třemi listy:
  1. Přehled   – souhrnná tabulka přechodů (kolik odešlo / přibylo)
  2. Odešli    – detail všech, kdo v dané dávce chyběli oproti předchozí
  3. Přibylo   – detail všech, kdo v dané dávce přibyly oproti předchozí

Pro data s více soubory se použijí unikátní CIPy (dávky jsou totožné).
"""

import sys
from datetime import date
from pathlib import Path
from collections import defaultdict

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "Knihovny"))
from mysql_db import connect_mysql

OUTPUT = Path(__file__).parent / "porovnani_davek.xlsx"

# ── Barvy ─────────────────────────────────────────────────────────────────────
CLR_HEADER   = "1F4E79"   # tmavě modrá
CLR_SUBHDR   = "2E75B6"   # střední modrá
CLR_ODEŠLI   = "FCE4D6"   # světle lososová
CLR_PŘIBYLO  = "E2EFDA"   # světle zelená
CLR_ZEBRA    = "F2F2F2"   # šedá pro zebra řádky
CLR_SUMMARY  = "DEEAF1"   # světle modrá pro souhrn

# ── Styly ─────────────────────────────────────────────────────────────────────
def hdr_font(white=True):
    return Font(bold=True, color="FFFFFF" if white else "000000", size=11)

def cell_border():
    thin = Side(style="thin", color="BFBFBF")
    return Border(left=thin, right=thin, top=thin, bottom=thin)

def set_header(cell, text, bg=CLR_HEADER, white=True):
    cell.value = text
    cell.font = hdr_font(white)
    cell.fill = PatternFill("solid", fgColor=bg)
    cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
    cell.border = cell_border()

def set_cell(cell, value, bg=None, bold=False, align="left", num_fmt=None):
    cell.value = value
    cell.font = Font(bold=bold, size=10)
    cell.alignment = Alignment(horizontal=align, vertical="center")
    cell.border = cell_border()
    if bg:
        cell.fill = PatternFill("solid", fgColor=bg)
    if num_fmt:
        cell.number_format = num_fmt

# ── Načtení dat z DB ──────────────────────────────────────────────────────────

print("Připojuji se k DB ...")
conn = connect_mysql()
cur  = conn.cursor()

# Unikátní CIPy per datum + jméno (z prvního souboru daného data)
cur.execute("""
    SELECT davka_rok, davka_mesic, davka_den, cip,
           MIN(prijmeni) AS prijmeni, MIN(jmeno) AS jmeno
    FROM seznam_pojistencu_davky
    GROUP BY davka_rok, davka_mesic, davka_den, cip
    ORDER BY davka_rok, davka_mesic, davka_den
""")
rows = cur.fetchall()
conn.close()

# Seskupení do dict: datum -> {cip: (prijmeni, jmeno)}
davky: dict[date, dict[str, tuple]] = defaultdict(dict)
for rok, mes, den, cip, pri, jme in rows:
    d = date(rok, mes, den)
    davky[d][cip] = (pri, jme)

data = sorted(davky.keys())
print(f"Nalezeno {len(data)} unikátních datumů dávek.")

# ── Porovnání ────────────────────────────────────────────────────────────────

prehled  = []   # (dat_od, dat_do, stav_od, odešlo, přibylo, stav_do)
odešli   = []   # (dat_do, cip, prijmeni, jmeno)
přibylo  = []   # (dat_do, cip, prijmeni, jmeno)

for i in range(1, len(data)):
    d1, d2 = data[i-1], data[i]
    cip1 = set(davky[d1])
    cip2 = set(davky[d2])

    vyšli  = cip1 - cip2
    vstou  = cip2 - cip1

    prehled.append((d1, d2, len(cip1), len(vyšli), len(vstou), len(cip2)))

    for cip in sorted(vyšli):
        pri, jme = davky[d1][cip]
        odešli.append((d2, cip, pri, jme))

    for cip in sorted(vstou):
        pri, jme = davky[d2][cip]
        přibylo.append((d2, cip, pri, jme))

# ── Excel ─────────────────────────────────────────────────────────────────────

wb = openpyxl.Workbook()

# ── List 1: Přehled ───────────────────────────────────────────────────────────
ws = wb.active
ws.title = "Přehled"
ws.freeze_panes = "A3"

# Nadpis
ws.merge_cells("A1:F1")
t = ws["A1"]
t.value = "Porovnání po sobě jdoucích dávek VZP – seznam registrovaných pojištěnců"
t.font = Font(bold=True, size=13, color="FFFFFF")
t.fill = PatternFill("solid", fgColor=CLR_HEADER)
t.alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[1].height = 28

# Záhlaví sloupců
headers = ["Datum od", "Datum do", "Stav\nna začátku", "Odešlo", "Přibylo", "Stav\nna konci"]
for col, h in enumerate(headers, 1):
    set_header(ws.cell(2, col), h)
ws.row_dimensions[2].height = 32

# Data
for row_i, (d1, d2, stav_od, vyšli, vstou, stav_do) in enumerate(prehled, 3):
    bg = CLR_ZEBRA if row_i % 2 == 0 else None
    set_cell(ws.cell(row_i, 1), d1.strftime("%d.%m.%Y"), bg, align="center")
    set_cell(ws.cell(row_i, 2), d2.strftime("%d.%m.%Y"), bg, align="center")
    set_cell(ws.cell(row_i, 3), stav_od, bg, align="right")
    set_cell(ws.cell(row_i, 4), -vyšli,  CLR_ODEŠLI if vyšli else bg, bold=bool(vyšli), align="right")
    set_cell(ws.cell(row_i, 5), vstou,   CLR_PŘIBYLO if vstou else bg, bold=bool(vstou), align="right")
    set_cell(ws.cell(row_i, 6), stav_do, bg, align="right")

# Souhrnný řádek
sr = len(prehled) + 3
ws.merge_cells(f"A{sr}:B{sr}")
sc = ws.cell(sr, 1)
sc.value = "CELKEM pohybů"
sc.font = Font(bold=True, size=10)
sc.fill = PatternFill("solid", fgColor=CLR_SUMMARY)
sc.alignment = Alignment(horizontal="center", vertical="center")
sc.border = cell_border()

celk_odešlo  = sum(p[3] for p in prehled)
celk_přibylo = sum(p[4] for p in prehled)
set_cell(ws.cell(sr, 3), "", CLR_SUMMARY)
set_cell(ws.cell(sr, 4), -celk_odešlo,  CLR_SUMMARY, bold=True, align="right")
set_cell(ws.cell(sr, 5), celk_přibylo,  CLR_SUMMARY, bold=True, align="right")
set_cell(ws.cell(sr, 6), "", CLR_SUMMARY)

# Šířky sloupců
for col, w in zip(range(1, 7), [14, 14, 14, 10, 10, 12]):
    ws.column_dimensions[get_column_letter(col)].width = w

# ── List 2: Odešli ────────────────────────────────────────────────────────────
ws2 = wb.create_sheet("Odešli")
ws2.freeze_panes = "A3"

ws2.merge_cells("A1:D1")
t2 = ws2["A1"]
t2.value = f"Pacienti, kteří odešli – celkem {len(odešli)} pohybů"
t2.font = Font(bold=True, size=13, color="FFFFFF")
t2.fill = PatternFill("solid", fgColor="C55A11")
t2.alignment = Alignment(horizontal="center", vertical="center")
ws2.row_dimensions[1].height = 28

for col, h in enumerate(["Datum dávky", "Číslo pojištěnce", "Příjmení", "Jméno"], 1):
    set_header(ws2.cell(2, col), h, bg="C55A11")
ws2.row_dimensions[2].height = 24

for row_i, (dat, cip, pri, jme) in enumerate(odešli, 3):
    bg = CLR_ODEŠLI if row_i % 2 == 0 else None
    set_cell(ws2.cell(row_i, 1), dat.strftime("%d.%m.%Y"), bg, align="center")
    set_cell(ws2.cell(row_i, 2), cip,  bg, align="center")
    set_cell(ws2.cell(row_i, 3), pri,  bg)
    set_cell(ws2.cell(row_i, 4), jme,  bg)

for col, w in zip(range(1, 5), [14, 16, 28, 22]):
    ws2.column_dimensions[get_column_letter(col)].width = w

# ── List 3: Přibylo ───────────────────────────────────────────────────────────
ws3 = wb.create_sheet("Přibylo")
ws3.freeze_panes = "A3"

ws3.merge_cells("A1:D1")
t3 = ws3["A1"]
t3.value = f"Pacienti, kteří přibylo – celkem {len(přibylo)} pohybů"
t3.font = Font(bold=True, size=13, color="FFFFFF")
t3.fill = PatternFill("solid", fgColor="375623")
t3.alignment = Alignment(horizontal="center", vertical="center")
ws3.row_dimensions[1].height = 28

for col, h in enumerate(["Datum dávky", "Číslo pojištěnce", "Příjmení", "Jméno"], 1):
    set_header(ws3.cell(2, col), h, bg="375623")
ws3.row_dimensions[2].height = 24

for row_i, (dat, cip, pri, jme) in enumerate(přibylo, 3):
    bg = CLR_PŘIBYLO if row_i % 2 == 0 else None
    set_cell(ws3.cell(row_i, 1), dat.strftime("%d.%m.%Y"), bg, align="center")
    set_cell(ws3.cell(row_i, 2), cip,  bg, align="center")
    set_cell(ws3.cell(row_i, 3), pri,  bg)
    set_cell(ws3.cell(row_i, 4), jme,  bg)

for col, w in zip(range(1, 5), [14, 16, 28, 22]):
    ws3.column_dimensions[get_column_letter(col)].width = w

# ── Uložení ───────────────────────────────────────────────────────────────────
wb.save(OUTPUT)
print(f"\nExcel uložen: {OUTPUT}")
print(f"  Přehled:  {len(prehled)} přechodů")
print(f"  Odešli:   {len(odešli)} pohybů")
print(f"  Přibylo:  {len(přibylo)} pohybů")
