"""Moji prijedlozi — view that reads the shared Promo Calendar store
(`promocalendar/data/promo_calendar.csv`) so the CM / Marketing user sees:

  • 🔧 Trebaju doradu — director sent back, you must revise here and re-submit
  • 💡 U pregledu — submitted, awaiting director's review
  • ✅ Odobreno — director approved, ready to go live
  • 🟢 Live — currently running in market

For "Trebaju doradu" entries there's a **🔁 Re-submit (after revisions)**
button that flips status back to 💡 idea and appends an audit-log entry.
For deeper revision (changing SKUs / discount / period) the user should
re-open the Promo Planner with the same name, build a fresh proposal
and submit — that part is left to the user; this page just tracks state.
"""
from __future__ import annotations

import importlib.util
from pathlib import Path as _P

import pandas as pd
import streamlit as st

# Load the SIBLING Promo Calendar's promo_data.py under a unique name.
# Plain `from promo_data import ...` would resolve to PromoTool's own
# promo_data.py (CM-side schema) — that one doesn't expose load_promos.
_CAL_PD = _P(__file__).parent.parent / "promocalendar" / "promo_data.py"
_spec = importlib.util.spec_from_file_location("calendar_promo_data", _CAL_PD)
_cpd = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(_cpd)
load_promos = _cpd.load_promos
update_promo = _cpd.update_promo
append_log = _cpd.append_log
delete_promo = _cpd.delete_promo


STATUS_GROUPS = [
    ("🔧 Trebaju doradu", ["🔧 preparing"]),
    ("💡 U pregledu",     ["💡 idea"]),
    ("✅ Odobreno",       ["✅ approved"]),
    ("🟢 Live",           ["🟢 live"]),
    ("📜 Sve",            None),
]


def _latest_director_comment(log_text: str) -> str:
    """Extract the most recent line mentioning 'Direktor nabave' or 'clash'."""
    if not log_text:
        return ""
    lines = [ln.strip() for ln in str(log_text).splitlines() if ln.strip()]
    for ln in reversed(lines):
        if "Direktor nabave" in ln or "Sent back" in ln or "clash" in ln.lower():
            return ln
    return lines[-1] if lines else ""


def _render_proposal(r: dict, allow_resubmit: bool):
    name = r.get("name", "")
    status = r.get("status", "")
    source = r.get("source", "")
    sw = int(r.get("start_week") or 0)
    ew = int(r.get("end_week") or 0)
    sy = int(r.get("start_year") or 0)
    period = f"CW{sw}" + (f"–CW{ew}" if ew > sw else "")
    skus = [s.strip() for s in str(r.get("skus", "") or "").split(",") if s.strip()]
    units = int(r.get("units", 0) or 0)
    last_note = _latest_director_comment(str(r.get("approval_log", "") or ""))

    with st.container(border=True):
        head_l, head_r = st.columns([4, 1])
        with head_l:
            st.markdown(f"**{name}**  ·  {status}")
            st.caption(f"{source}  ·  {period} ({sy})  ·  "
                       f"{len(skus)} SKU  ·  {units:,} units")
            if last_note:
                st.caption(f"📜 {last_note}")
        with head_r:
            if allow_resubmit:
                pid = r["id"]
                if st.button("🔁 Re-submit",
                              key=f"resub_{pid}",
                              use_container_width=True,
                              type="primary",
                              help="Označi da je prijedlog revidiran i šalji ponovo "
                                   "direktoru na odobrenje."):
                    update_promo(pid, {"status": "💡 idea"})
                    append_log(pid, str(r.get("owner") or "Promo Tool"),
                               "Re-submitted after revisions", "")
                    st.success("Prijedlog ponovno poslan na odobrenje.")
                    st.rerun()
                if st.button("🗑️ Odustani",
                              key=f"drop_{pid}",
                              use_container_width=True,
                              help="Obriši prijedlog (npr. ako je neaktualan)."):
                    delete_promo(pid)
                    st.success("Prijedlog obrisan.")
                    st.rerun()

        with st.expander("Detalji"):
            cc1, cc2 = st.columns(2)
            cc1.markdown("**Artikli**")
            if skus:
                cc1.write(pd.DataFrame({"SKU": skus}))
            else:
                cc1.caption("—")
            cc2.markdown("**Audit log**")
            log = str(r.get("approval_log", "") or "").strip()
            if log:
                for ln in log.splitlines():
                    cc2.caption(ln)
            else:
                cc2.caption("—")


def render():
    st.title("📋 Moji prijedlozi")
    st.caption(
        "Pregled svih prijedloga koji su poslani u Promo Calendar. "
        "Statusi se mijenjaju automatski na temelju direktorovih akcija. "
        "Ako je prijedlog vraćen na doradu (🔧 *Trebaju doradu*) — revidiraj "
        "ga ovdje (ili napravi novi u **Promo Planner** stranici) i klikni "
        "**Re-submit** kad si gotov."
    )

    df = load_promos()
    if df.empty:
        st.info("Nema prijedloga još. Otvori **Promo Planner**, isplaniraj akciju "
                "i klikni **Submit to Promo Calendar**.")
        return

    # Optional owner filter — for demo, owner is typed; let user filter by it.
    owners = sorted(set(str(o).strip() for o in df["owner"].fillna("") if str(o).strip()))
    f1, f2 = st.columns([2, 3])
    sel_owner = f1.selectbox(
        "Filter po owneru", ["(svi)"] + owners,
        key="my_prop_owner",
    )
    f2.caption("💡 Za demo nema login-a — koristi owner filter da vidiš samo svoje prijedloge.")

    if sel_owner != "(svi)":
        df = df[df["owner"].astype(str).str.strip() == sel_owner]

    # KPIs
    k1, k2, k3, k4 = st.columns(4)
    k1.metric("Trebaju doradu", int(df["status"].eq("🔧 preparing").sum()))
    k2.metric("U pregledu",     int(df["status"].eq("💡 idea").sum()))
    k3.metric("Odobreno",       int(df["status"].eq("✅ approved").sum()))
    k4.metric("Live",           int(df["status"].eq("🟢 live").sum()))

    tabs = st.tabs([label for label, _ in STATUS_GROUPS])
    for tab, (label, statuses) in zip(tabs, STATUS_GROUPS):
        with tab:
            sub = df if statuses is None else df[df["status"].isin(statuses)]
            sub = sub.sort_values(["start_year", "start_week"])
            if sub.empty:
                st.caption("Nema prijedloga u ovoj kategoriji.")
                continue
            allow_resub = (statuses == ["🔧 preparing"])
            for _, r in sub.iterrows():
                _render_proposal(r.to_dict(), allow_resubmit=allow_resub)
