import os, sys, sqlite3, tempfile, subprocess
from datetime import date
import pandas as pd
import streamlit as st

import kpi_ops_service_v4 as ops
import kpi_galv_service_v3 as galv

DB_NAME = "operations_company.db"
IMPORT_BROCHE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "import_jobs_daily_v4.py")
IMPORT_GALV = os.path.join(os.path.dirname(os.path.abspath(__file__)), "import_galv_excel.py")

# --- PDF Reports (optional if reportlab missing) ---
REPORTS_OK = True
REPORTS_ERR = ""
try:
    from report_service_v3 import (
        make_report_broche_shift,
        make_report_day_broche_galv,
        make_report_broche_period,
        make_employee_bulletin,
    )
except Exception as e:
    REPORTS_OK = False
    REPORTS_ERR = str(e)

# --- Debug: show which report module is actually used ---
try:
    import report_service_v3 as _rpt
    _REPORT_FILE = getattr(_rpt, '__file__', 'unknown')
except Exception:
    _REPORT_FILE = 'report_service_v3 not loaded'

st.set_page_config(page_title="Ops - Broche + Galvanisation", layout="wide")
st.title("🏭 Opérations • Broche + Galvanisation")
st.caption(f"Broche KPI: {getattr(ops, '__version__', 'unknown')} • Galv KPI: {getattr(galv, '__version__', 'unknown')}")
st.sidebar.caption(f"DB : {os.path.abspath(DB_NAME)}")
st.sidebar.caption(f"Report module: {_REPORT_FILE}")

@st.cache_resource
def get_conn():
    conn = sqlite3.connect(DB_NAME, check_same_thread=False)
    conn.row_factory = sqlite3.Row
    return conn

def run_script(script_path, args):
    cmd = [sys.executable, script_path] + args
    r = subprocess.run(cmd, capture_output=True, text=True)
    return r.returncode, r.stdout, r.stderr

def db_exists():
    return os.path.exists(DB_NAME)

def list_employees(conn):
    try:
        df = pd.read_sql_query("SELECT Nom FROM Employes ORDER BY Nom", conn)
        return df["Nom"].dropna().astype(str).tolist()
    except Exception:
        return []

def safe_make_report(fn, out_name: str, *args):
    import tempfile
    with tempfile.TemporaryDirectory() as td:
        out_path = os.path.join(td, out_name)
        fn(*args, out_path)
        with open(out_path, "rb") as f:
            return f.read()

conn = get_conn()

section = st.sidebar.radio("Navigation", [
    "➕ Import Broche (jobs)",
    "➕ Import Galvanisation",
    "👥 Équipe (superviseur + stations)",
    "📈 KPI Broche (quotidiens)",
    "🧑‍🏭 Racks par employé (périodes)",
    "📅 KPI Broche (périodes) + Jour vs Soir",
    "🧪 KPI Galvanisation (quotidiens + périodes)",
    "🧩 Job 360 (Broche + Galv reliés)",
    "📄 Export PDF (4 rapports)",
    "🗑️ Supprimer données",
    "ℹ️ Vérifier DB / tables",
])

if section == "➕ Import Broche (jobs)":
    st.header("➕ Import Broche (jobs)")
    st.caption("Stations acceptées dans l'Excel: 1,2,3,c,a (c= Cafe, a= Acide).")
    uploaded = st.file_uploader("Importer fichier Excel Broche", type=["xlsx"], key="broche_up")
    c1, c2, c3 = st.columns(3)
    with c1:
        d = st.date_input("Date des opérations", value=date.today(), key="broche_date")
    with c2:
        quart = st.selectbox("Quart", ["Jour","Soir","Nuit"], index=1, key="broche_quart")
    with c3:
        sheet = st.text_input("Nom de feuille (optionnel)", key="broche_sheet")

    if uploaded and st.button("Importer Broche"):
        with tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx") as tmp:
            tmp.write(uploaded.read()); tmp_path = tmp.name
        args = [tmp_path, d.isoformat(), quart]
        if sheet.strip():
            args.append(sheet.strip())
        code, out, err = run_script(IMPORT_BROCHE, args)
        st.code(out or "", language="bash")
        if err: st.error(err)
        st.success("✅ Import Broche terminé." if code == 0 else f"❌ Import en erreur (code {code}).")

elif section == "➕ Import Galvanisation":
    st.header("➕ Import Galvanisation (Production_Detail)")
    uploaded = st.file_uploader("Importer fichier Excel Galvanisation", type=["xlsx"], key="galv_up")
    sheet = st.text_input("Nom de feuille (optionnel)", key="galv_sheet")
    if uploaded and st.button("Importer Galvanisation"):
        with tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx") as tmp:
            tmp.write(uploaded.read()); tmp_path = tmp.name
        args = [tmp_path]
        if sheet.strip():
            args.append(sheet.strip())
        code, out, err = run_script(IMPORT_GALV, args)
        st.code(out or "", language="bash")
        if err: st.error(err)
        st.success("✅ Import Galvanisation terminé." if code == 0 else f"❌ Import en erreur (code {code}).")

elif section == "👥 Équipe (superviseur + stations)":
    st.header("👥 Équipe (superviseur + stations)")
    c1, c2 = st.columns(2)
    with c1:
        d = st.date_input("Date", value=date.today(), key="sup_date")
    with c2:
        quart = st.selectbox("Quart", ["Jour","Soir","Nuit"], index=1, key="sup_quart")
    sup_name = st.text_input("Nom du superviseur", key="sup_name")
    if st.button("💾 Enregistrer superviseur du quart"):
        if not sup_name.strip():
            st.error("Nom superviseur obligatoire.")
        else:
            cur = conn.cursor()
            cur.execute("INSERT OR IGNORE INTO Employes (Nom) VALUES (?)", (sup_name.strip(),))
            cur.execute("SELECT EmployeID FROM Employes WHERE Nom = ?", (sup_name.strip(),))
            sup_id = cur.fetchone()[0]
            cur.execute(
                "INSERT INTO ShiftSupervisors (Date, Quart, SuperviseurID) VALUES (?,?,?) "
                "ON CONFLICT(Date, Quart) DO UPDATE SET SuperviseurID=excluded.SuperviseurID",
                (d.isoformat(), quart, sup_id)
            )
            conn.commit()
            st.success("✅ Superviseur enregistré / mis à jour.")
    st.dataframe(pd.read_sql_query(
        "SELECT ss.Date, ss.Quart, e.Nom AS Superviseur FROM ShiftSupervisors ss LEFT JOIN Employes e ON e.EmployeID=ss.SuperviseurID ORDER BY ss.Date DESC, ss.Quart LIMIT 200",
        conn
    ), use_container_width=True)

    st.divider()
    st.subheader("Assignations employés par station")
    df_s = pd.read_sql_query("SELECT StationID, NomStation FROM Stations ORDER BY NomStation", conn)
    if df_s.empty:
        st.info("Aucune station en base. Fais un import Broche d'abord.")
    else:
        station_label_to_id = {f"{r['NomStation']} (#{int(r['StationID'])})": int(r["StationID"]) for _, r in df_s.iterrows()}
        c1, c2 = st.columns(2)
        with c1:
            d2 = st.date_input("Date (assignations)", value=date.today(), key="sw_date")
        with c2:
            quart2 = st.selectbox("Quart (assignations)", ["Jour","Soir","Nuit"], index=1, key="sw_quart")
        st_station = st.selectbox("Station", list(station_label_to_id.keys()), key="sw_station")
        station_id2 = station_label_to_id[st_station]
        names = st.text_input("Employés (séparés par des virgules)", key="sw_names")
        if st.button("➕ Ajouter assignation(s)"):
            if not names.strip():
                st.error("Entre au moins un nom.")
            else:
                cur = conn.cursor()
                added = 0
                for nm in [x.strip() for x in names.split(",") if x.strip()]:
                    cur.execute("INSERT OR IGNORE INTO Employes (Nom) VALUES (?)", (nm,))
                    cur.execute("SELECT EmployeID FROM Employes WHERE Nom = ?", (nm,))
                    emp_id = cur.fetchone()[0]
                    cur.execute(
                        "INSERT OR IGNORE INTO StationWorkers (Date, Quart, StationID, EmployeID) VALUES (?,?,?,?)",
                        (d2.isoformat(), quart2, station_id2, emp_id)
                    )
                    if cur.rowcount > 0:
                        added += 1
                conn.commit()
                st.success(f"✅ {added} assignation(s) ajoutée(s).")
        st.dataframe(pd.read_sql_query(
            """SELECT sw.Date, sw.Quart, s.NomStation, e.Nom AS Employe
                 FROM StationWorkers sw
                 LEFT JOIN Stations s ON s.StationID=sw.StationID
                 LEFT JOIN Employes e ON e.EmployeID=sw.EmployeID
                 ORDER BY sw.Date DESC, sw.Quart, s.NomStation, e.Nom
                 LIMIT 800""",
            conn
        ), use_container_width=True)

elif section == "📈 KPI Broche (quotidiens)":
    st.header("📈 KPI Broche - quotidien")
    c1, c2 = st.columns(2)
    with c1:
        d = st.date_input("Date", value=date.today(), key="bd")
    with c2:
        quart = st.selectbox("Quart", ["Jour","Soir","Nuit"], index=1, key="bq")
    header, by_station, alloc, _ = ops.compute_daily_kpis(conn, d.isoformat(), quart)
    if header.empty:
        st.info("Aucune donnée.")
    else:
        st.dataframe(header, use_container_width=True)
        by_station2 = by_station.copy()
        by_station2["Libellé"] = by_station2.apply(lambda r: f"{r['NomStation']} — {r.get('Employes') or ''}", axis=1)
        st.subheader("Graphiques (station — employés)")
        st.bar_chart(by_station2.set_index("Libellé")[["RacksDistinct"]])
        st.bar_chart(by_station2.set_index("Libellé")[["Jobs"]])
        st.bar_chart(by_station2.set_index("Libellé")[["TempsMoyenMin"]])
        st.subheader("Allocation racks par employé")
        st.dataframe(alloc, use_container_width=True)

elif section == "🧑‍🏭 Racks par employé (périodes)":
    st.header("🧑‍🏭 Racks par employé (Broche)")
    c1, c2, c3 = st.columns(3)
    with c1:
        d1 = st.date_input("Date début", value=date.today().replace(day=1), key="ed1")
    with c2:
        d2 = st.date_input("Date fin", value=date.today(), key="ed2")
    with c3:
        quart = st.selectbox("Quart", ["Jour","Soir","Nuit"], index=1, key="eq")
    by = st.selectbox("Agrégation", ["week","month","year"], index=0, key="eby")
    out = ops.compute_period_employee_racks(conn, d1.isoformat(), d2.isoformat(), quart=quart, by=by)
    st.dataframe(out, use_container_width=True)
    if not out.empty:
        per = st.selectbox("Période", out["Periode"].unique().tolist())
        top = out[out["Periode"]==per].sort_values("RacksAlloues", ascending=False).head(15)
        st.bar_chart(top.set_index("EmployeNom")[["RacksAlloues"]])

elif section == "📅 KPI Broche (périodes) + Jour vs Soir":
    st.header("📅 KPI Broche - périodes + comparaison Jour vs Soir")
    c1, c2, c3 = st.columns(3)
    with c1:
        d1 = st.date_input("Date début", value=date.today().replace(day=1), key="pd1")
    with c2:
        d2 = st.date_input("Date fin", value=date.today(), key="pd2")
    with c3:
        by = st.selectbox("Agrégation", ["week","month","year"], index=0, key="pby")
    out = ops.compute_period_kpis(conn, d1.isoformat(), d2.isoformat(), quart=None, by=by)
    st.dataframe(out, use_container_width=True)
    if not out.empty:
        pivot_jobs = out.pivot_table(index="Periode", columns="Quart", values="Jobs", aggfunc="sum").fillna(0)
        pivot_racks = out.pivot_table(index="Periode", columns="Quart", values="RacksDistinct", aggfunc="sum").fillna(0)
        pivot_time = out.pivot_table(index="Periode", columns="Quart", values="TempsMoyenMin", aggfunc="mean")
        st.subheader("Graphiques Jour vs Soir")
        st.line_chart(pivot_jobs[[c for c in ["Jour","Soir"] if c in pivot_jobs.columns]])
        st.line_chart(pivot_racks[[c for c in ["Jour","Soir"] if c in pivot_racks.columns]])
        cols = [c for c in ["Jour","Soir"] if c in pivot_time.columns]
        if cols:
            st.line_chart(pivot_time[cols])

elif section == "🧪 KPI Galvanisation (quotidiens + périodes)":
    st.header("🧪 KPI Galvanisation")
    tab1, tab2 = st.tabs(["Quotidien", "Périodes"])
    with tab1:
        d = st.date_input("Date production (galv)", value=date.today(), key="gd")
        header, by_job = galv.daily_kpis(conn, d.isoformat())
        if header.empty:
            st.info("Aucune donnée galvanisation pour cette date.")
        else:
            st.dataframe(header, use_container_width=True)
            st.subheader("Top jobs (poids)")
            st.dataframe(by_job, use_container_width=True)
            st.bar_chart(by_job.head(15).set_index("JobFull")[["PoidsLb"]])
    with tab2:
        c1, c2, c3 = st.columns(3)
        with c1:
            d1 = st.date_input("Début", value=date.today().replace(day=1), key="g1")
        with c2:
            d2 = st.date_input("Fin", value=date.today(), key="g2")
        with c3:
            by = st.selectbox("Agrégation", ["week","month","year"], index=0, key="gby")
        out = galv.period_kpis(conn, d1.isoformat(), d2.isoformat(), by=by)
        st.dataframe(out, use_container_width=True)
        if not out.empty:
            st.line_chart(out.set_index("Periode")[["PoidsLb"]])
            st.line_chart(out.set_index("Periode")[["Pieces"]])

elif section == "🧩 Job 360 (Broche + Galv reliés)":
    st.header("🧩 Job 360 — tout relié (Broche + Galvanisation)")
    st.caption("Le # job dans Broche = les 3 ou 4 derniers chiffres du Job dans Galvanisation.")
    job = st.text_input("Entre le job (ex: 227 ou 0227)", key="job360")

    if job.strip():
        summary, broche, broche_by_day, galv_lines, galv_piece = galv.job_360(conn, job.strip())

        if summary is None:
            st.error("Job invalide.")
        else:
            c1, c2, c3, c4, c5 = st.columns(5)
            c1.metric("Racks distincts (broche)", summary["Racks distincts (broche)"])
            c2.metric("Pièces total (galv)", summary["Pièces total (galv)"])
            c3.metric("Pièces différentes (galv)", summary["Pièces différentes (galv)"])
            c4.metric("Poids total lb (galv)", summary["Poids total lb (galv)"])
            c5.metric("Lag min (jours)", summary["Lag min broche→galv (jours)"] if summary["Lag min broche→galv (jours)"] is not None else "—")

            st.subheader("Résumé")
            st.dataframe(pd.DataFrame([summary]), use_container_width=True)

            st.subheader("Broche — détails (avec qui a broché)")
            if broche.empty:
                st.info("Aucune donnée Broche pour ce job. (Vérifie que tes JobNumber sont bien numériques, sinon lance normalize_jobnumbers.py)")
            else:
                st.caption("EmployeNom = si le nom était dans l'Excel. Sinon, EmployesAssignes = assignation station (onglet Équipe).")
                st.dataframe(broche, use_container_width=True)

            st.subheader("Broche — résumé par jour/quart/station")
            if not broche_by_day.empty:
                st.dataframe(broche_by_day, use_container_width=True)

            st.subheader("Galvanisation — lignes")
            if galv_lines.empty:
                st.info("Aucune donnée Galvanisation matchée (suffix 3/4 chiffres).")
            else:
                st.dataframe(galv_lines, use_container_width=True)

            st.subheader("Galvanisation — pièces (distinctes) + poids")
            if not galv_piece.empty:
                st.dataframe(galv_piece, use_container_width=True)
                st.bar_chart(galv_piece.head(15).set_index("PieceDescription")[["PoidsLb"]])


elif section == "🗑️ Supprimer données":
    st.header("🗑️ Supprimer / annuler une importation")
    st.warning("⚠️ Cette page supprime des lignes dans la base SQLite. Fais une copie de la DB avant si tu veux pouvoir revenir en arrière.")

    # Backup
    st.subheader("1) Sauvegarde rapide (recommandé)")
    if st.button("📦 Créer une copie de la DB (backup)"):
        import shutil, time
        ts = datetime.now().strftime("%Y%m%d_%H%M%S")
        src_db = DB_NAME
        backup_name = f"{Path(src_db).stem}_backup_{ts}.db"
        shutil.copyfile(src_db, backup_name)
        st.success(f"Backup créé: {backup_name}")

    st.subheader("2) Supprimer par date et quart")
    col1, col2 = st.columns(2)
    with col1:
        d = st.date_input("Date à supprimer", value=date.today())
    with col2:
        quart = st.selectbox("Quart", ["Jour", "Soir", "Nuit"], index=0)

    conn = sqlite3.connect(DB_NAME)
    # Show counts to be deleted (broche + galv)
    date_str = d.isoformat()
    counts = {}
    try:
        counts["JobRecords"] = pd.read_sql_query("SELECT COUNT(*) AS n FROM JobRecords WHERE Date=? AND Quart=?", conn, params=[date_str, quart]).iloc[0]["n"]
    except Exception:
        counts["JobRecords"] = 0
    try:
        counts["StationWorkers"] = pd.read_sql_query("SELECT COUNT(*) AS n FROM StationWorkers WHERE Date=? AND Quart=?", conn, params=[date_str, quart]).iloc[0]["n"]
    except Exception:
        counts["StationWorkers"] = 0
    try:
        counts["ShiftSupervisors"] = pd.read_sql_query("SELECT COUNT(*) AS n FROM ShiftSupervisors WHERE Date=? AND Quart=?", conn, params=[date_str, quart]).iloc[0]["n"]
    except Exception:
        counts["ShiftSupervisors"] = 0

    # Galv tables may or may not exist; try a few common names
    galv_tables = ["GalvRecords", "GalvDetails", "Galvanisation", "GalvProduction"]
    galv_counts = {}
    for t in galv_tables:
        try:
            galv_counts[t] = pd.read_sql_query(f"SELECT COUNT(*) AS n FROM {t} WHERE Date=? AND Quart=?", conn, params=[date_str, quart]).iloc[0]["n"]
        except Exception:
            continue

    st.info(f"Ce qui sera supprimé pour {date_str} ({quart}) :")
    st.write(pd.DataFrame([counts]))
    if galv_counts:
        st.write("Galvanisation:")
        st.write(pd.DataFrame([galv_counts]))
    else:
        st.caption("Aucune table galvanisation trouvée (ou pas de colonne Date/Quart).")

    st.subheader("3) Confirmer la suppression")
    token = st.text_input('Tape exactement: SUPPRIMER', value="")
    if st.button("🗑️ Supprimer maintenant"):
        if token.strip().upper() != "SUPPRIMER":
            st.error("Confirmation incorrecte. Tape SUPPRIMER pour exécuter.")
        else:
            cur = conn.cursor()
            # Delete broche shift data
            for sql in [
                ("DELETE FROM JobRecords WHERE Date=? AND Quart=?", [date_str, quart]),
                ("DELETE FROM StationWorkers WHERE Date=? AND Quart=?", [date_str, quart]),
                ("DELETE FROM ShiftSupervisors WHERE Date=? AND Quart=?", [date_str, quart]),
            ]:
                try:
                    cur.execute(sql[0], sql[1])
                except Exception as e:
                    st.warning(f"Impossible d'exécuter: {sql[0]} ({e})")

            # Delete galv if possible (best effort)
            for t in galv_tables:
                try:
                    cur.execute(f"DELETE FROM {t} WHERE Date=? AND Quart=?", [date_str, quart])
                except Exception:
                    pass

            conn.commit()
            st.success("Suppression terminée ✅")
            st.info("Recharge tes KPI / rapports: les doublons devraient être corrigés.")
    conn.close()

    st.subheader("Alternative : dédoublonner au lieu de supprimer")
    st.caption("Si tu veux une option 'dé-dupe' (garder 1 copie), je peux te l'ajouter aussi.")

elif section == "ℹ️ Vérifier DB / tables":
    st.header("ℹ️ Vérifier DB / tables")
    if not db_exists():
        st.error("La base n'existe pas encore. Mets operations_company.db dans le dossier de l'app ou fais un import.")
    else:
        st.success("✅ DB trouvée.")
        try:
            tables = pd.read_sql_query("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name", conn)
            st.dataframe(tables, use_container_width=True)
        except Exception as e:
            st.error(str(e))

        st.subheader("Compteurs rapides")
        cols = st.columns(3)
        try:
            cols[0].metric("JobRecords", int(pd.read_sql_query("SELECT COUNT(*) AS n FROM JobRecords", conn).iloc[0]["n"]))
        except Exception:
            cols[0].metric("JobRecords", "—")
        try:
            cols[1].metric("GalvRecords", int(pd.read_sql_query("SELECT COUNT(*) AS n FROM GalvRecords", conn).iloc[0]["n"]))
        except Exception:
            cols[1].metric("GalvRecords", "—")
        try:
            cols[2].metric("Employes", int(pd.read_sql_query("SELECT COUNT(*) AS n FROM Employes", conn).iloc[0]["n"]))
        except Exception:
            cols[2].metric("Employes", "—")

elif section == "📄 Export PDF (4 rapports)":
    st.header("📄 Export PDF (4 rapports)")

    if not REPORTS_OK:
        st.error("Le module de rapports n'est pas disponible dans ton environnement.")
        st.code(REPORTS_ERR)
        st.info("Solution: installe ReportLab:  python -m pip install reportlab")
        st.stop()

    if not db_exists():
        st.error("La DB n'existe pas encore. Mets operations_company.db dans le dossier ou importe tes fichiers d'abord.")
        st.stop()

    tab1, tab2, tab3, tab4 = st.tabs([
        "1) Broche - Quart",
        "2) Journée - Broche + Galv",
        "3) Période - Broche (par quart)",
        "4) Bulletin employé",
    ])

    with tab1:
        st.subheader("1) Rapport Broche pour un quart")
        c1, c2 = st.columns(2)
        with c1:
            d = st.date_input("Date", value=date.today(), key="r_shift_date")
        with c2:
            quart = st.selectbox("Quart", ["Jour","Soir","Nuit"], index=1, key="r_shift_quart")
        if st.button("Générer PDF (Broche quart)", key="btn_shift"):
            pdf_bytes = safe_make_report(
                make_report_broche_shift,
                f"rapport_broche_{d.isoformat()}_{quart}.pdf",
                DB_NAME, d.isoformat(), quart
            )
            st.download_button(
                "⬇️ Télécharger le PDF",
                data=pdf_bytes,
                file_name=f"rapport_broche_{d.isoformat()}_{quart}.pdf",
                mime="application/pdf",
                key="dl_shift"
            )

    with tab2:
        st.subheader("2) Rapport Broche + Galvanisation pour une journée")
        d = st.date_input("Date", value=date.today(), key="r_day_date")
        if st.button("Générer PDF (Journée Broche+Galv)", key="btn_day"):
            pdf_bytes = safe_make_report(
                make_report_day_broche_galv,
                f"rapport_journee_{d.isoformat()}.pdf",
                DB_NAME, d.isoformat()
            )
            st.download_button(
                "⬇️ Télécharger le PDF",
                data=pdf_bytes,
                file_name=f"rapport_journee_{d.isoformat()}.pdf",
                mime="application/pdf",
                key="dl_day"
            )

    with tab3:
        st.subheader("3) Rapport Broche pour une période (semaine/mois/année) — par quart")
        c1, c2, c3 = st.columns(3)
        with c1:
            d1 = st.date_input("Début", value=date.today().replace(day=1), key="r_p_from")
        with c2:
            d2 = st.date_input("Fin", value=date.today(), key="r_p_to")
        with c3:
            group = st.selectbox("Agrégation", ["week","month","year"], index=1, key="r_p_group")
        if st.button("Générer PDF (Période Broche)", key="btn_period"):
            pdf_bytes = safe_make_report(
                make_report_broche_period,
                f"rapport_broche_{group}_{d1.isoformat()}_{d2.isoformat()}.pdf",
                DB_NAME, d1.isoformat(), d2.isoformat(), group
            )
            st.download_button(
                "⬇️ Télécharger le PDF",
                data=pdf_bytes,
                file_name=f"rapport_broche_{group}_{d1.isoformat()}_{d2.isoformat()}.pdf",
                mime="application/pdf",
                key="dl_period"
            )

    with tab4:
        st.subheader("4) Bulletin rendement employé (période)")
        names = list_employees(conn)
        c1, c2, c3 = st.columns(3)
        with c1:
            if names:
                emp = st.selectbox("Employé", names, index=0, key="r_emp_name")
            else:
                emp = st.text_input("Employé (nom exact)", key="r_emp_name_txt")
        with c2:
            d1 = st.date_input("Début", value=date.today().replace(day=1), key="r_emp_from")
        with c3:
            d2 = st.date_input("Fin", value=date.today(), key="r_emp_to")

        st.info("Note: le bulletin utilise les assignations StationWorkers pour calculer les 'racks alloués' (racks station / nb employés à la station).")

        if st.button("Générer PDF (Bulletin employé)", key="btn_emp"):
            if not str(emp).strip():
                st.error("Choisis ou entre un employé.")
            else:
                safe_name = str(emp).replace(" ", "_")
                pdf_bytes = safe_make_report(
                    make_employee_bulletin,
                    f"bulletin_{safe_name}_{d1.isoformat()}_{d2.isoformat()}.pdf",
                    DB_NAME, str(emp).strip(), d1.isoformat(), d2.isoformat()
                )
                st.download_button(
                    "⬇️ Télécharger le PDF",
                    data=pdf_bytes,
                    file_name=f"bulletin_{safe_name}_{d1.isoformat()}_{d2.isoformat()}.pdf",
                    mime="application/pdf",
                    key="dl_emp"
                )