"""Marketing-mode Past Web Promotions browser.

Mirrors the CM Past Promotions page (page_history.py) but is driven by
the webshop coupon log instead of the ERP promo calendar. Granularity
is daily, channel is webshop-only, discount % is the real applied %."""
from __future__ import annotations

import pandas as pd
import streamlit as st
import plotly.graph_objects as go

from promo_data import load_all
from marketing_data import (
    load_coupons, build_marketing_campaigns, permanent_codes,
    daily_units_for_campaign,
)


def render():
    coupons = load_coupons()
    if coupons.empty:
        st.error("Nema kupon order loga u PromoTool/data/. "
                  "Treba fajl: 'Detaljni report jedan red po orderu, "
                  "kuponu i proizvodu..csv'.")
        return

    data = load_all()
    sales = data["sales"]
    campaigns = build_marketing_campaigns(
        coupons, sales, data["name_map"], data["cat_map"], data["tier_map"]
    )

    # ---- SIDEBAR FILTERS ----
    with st.sidebar:
        st.markdown("### 📣 Web kampanje")
        st.caption(f"{len(campaigns)} kampanja · {len(coupons):,} stavki")

        all_years = sorted({c["first"].year for c in campaigns}, reverse=True)
        year_pick = st.selectbox("Godina", ["Sve"] + all_years, key="mkt_year")
        search = st.text_input("Pretraga", "", key="mkt_search")
        show_perm = st.checkbox("Prikaži trajne kodove (influenceri, podcast, gift)",
                                  value=False, key="mkt_perm")

    # ---- FILTER ----
    flt = []
    for c in campaigns:
        if year_pick != "Sve" and c["first"].year != year_pick:
            continue
        if search and search.lower() not in c["campaign"].lower():
            continue
        flt.append(c)

    # ---- HEADER ----
    st.markdown("## 📣 Web kampanje — povijest kupona")
    st.caption(f"{len(flt)} kampanja · webshop kanal · "
                f"period: {coupons['date_added'].min().date()} → "
                f"{coupons['date_added'].max().date()}")

    if not flt:
        st.info("Nema kampanja koje odgovaraju filterima.")
        if show_perm:
            _render_permanent(coupons)
        return

    # ---- CAMPAIGN PICKER ----
    labels = [
        f"{c['campaign']}  ·  {c['first'].date()} → {c['last'].date()}  "
        f"({c['days']}d)  ·  {c['n_skus']} SKUs · {c['total_units']:,} u · "
        f"€{c['total_discount']:,.0f} popust"
        for c in flt
    ]
    pick_idx = st.selectbox("Kampanja", range(len(flt)),
                              format_func=lambda i: labels[i], key="mkt_pick")
    c = flt[pick_idx]

    # ---- CAMPAIGN DETAIL ----
    st.markdown(f"### 📌 {c['campaign']}")
    st.caption(f"{c['first'].date()} → {c['last'].date()}  ·  {c['days']} dana  ·  "
                f"{c['n_coupons']} kupona  ·  {c['n_skus']} SKU-ova")

    k1, k2, k3, k4, k5 = st.columns(5)
    k1.metric("SKUs", f"{c['n_skus']:,}")
    k2.metric("Units", f"{c['total_units']:,}")
    k3.metric("Revenue (after)", f"€{c['total_rev_after']:,.0f}")
    k4.metric("Discount given", f"€{c['total_discount']:,.0f}")
    avg_disc = (c["total_discount"] / c["total_rev_before"] * 100
                  if c["total_rev_before"] > 0 else 0)
    k5.metric("Avg discount", f"{avg_disc:.1f}%")

    # ---- DAILY CHART ----
    st.markdown("#### 📈 Dnevna prodaja kroz kampanju")
    daily = daily_units_for_campaign(coupons, c["campaign"])
    if daily.empty:
        st.info("Nema dnevnih podataka.")
    else:
        all_days = sorted(daily["date"].unique())
        top_coupons = (daily.groupby("coupon_code")["units"].sum()
                          .sort_values(ascending=False).head(8).index.tolist())
        PALETTE = ["#FF6B6B", "#38BDF8", "#FBBF24", "#4ADE80", "#A78BFA",
                    "#F472B6", "#34D399", "#FB923C"]
        fig = go.Figure()
        for i, code in enumerate(top_coupons):
            sub = daily[daily["coupon_code"] == code]
            qty_by_day = dict(zip(sub["date"], sub["units"]))
            ys = [qty_by_day.get(d, 0) for d in all_days]
            fig.add_trace(go.Bar(
                x=[str(d) for d in all_days], y=ys,
                name=code, marker_color=PALETTE[i % len(PALETTE)],
                hovertemplate=f"<b>{code}</b><br>%{{x}}: %{{y}} u<extra></extra>",
            ))
        # any remaining coupons collapsed
        other = daily[~daily["coupon_code"].isin(top_coupons)]
        if not other.empty:
            ot = other.groupby("date")["units"].sum().to_dict()
            ys = [ot.get(d, 0) for d in all_days]
            fig.add_trace(go.Bar(
                x=[str(d) for d in all_days], y=ys,
                name="ostali", marker_color="#6B7280",
                hovertemplate="ostali<br>%{x}: %{y} u<extra></extra>",
            ))
        fig.update_layout(
            barmode="stack", plot_bgcolor="#1A1D27", paper_bgcolor="#1A1D27",
            font=dict(color="#E8E9ED"), height=380,
            margin=dict(l=10, r=10, t=20, b=30),
            xaxis=dict(showgrid=False),
            yaxis=dict(title="Units / dan", gridcolor="#2A2D3A"),
            legend=dict(orientation="h", y=-0.20, x=0.5, xanchor="center",
                          font=dict(size=10)),
        )
        st.plotly_chart(fig, use_container_width=True)

    # ---- COUPONS TABLE ----
    st.markdown("#### 🎟️ Kuponi unutar kampanje")
    cdf = pd.DataFrame(c["coupons"])
    cdf = cdf[["code", "name", "first", "last", "days_active",
                "orders", "units", "discount", "avg_disc_pct"]]
    cdf.columns = ["Kod", "Naziv", "Od", "Do", "Dana",
                    "Orders", "Units", "Popust €", "Avg %"]
    st.dataframe(cdf, use_container_width=True, hide_index=True)

    # ---- SKU TABLE ----
    st.markdown("#### 📦 SKU-ovi (sortirano po units)")
    sdf = pd.DataFrame(c["skus"])
    sdf = sdf[["sku", "name", "cat", "tier", "units", "orders",
                "avg_base", "avg_promo", "uplift",
                "rev_after", "discount", "disc_pct"]]
    sdf.columns = ["SKU", "Name", "Category", "Tier", "Units", "Orders",
                    "Avg base/wk (web)", "Avg promo/wk", "Uplift",
                    "Revenue (after) €", "Popust €", "Disc %"]
    st.dataframe(sdf, use_container_width=True, hide_index=True)

    # ---- CSV export ----
    csv = sdf.to_csv(index=False).encode("utf-8")
    st.download_button("⬇️ Export ove kampanje (SKU breakdown)", csv,
                        file_name=f"marketing_{c['id']}.csv", mime="text/csv")

    # ---- TRAJNI KODOVI (optional) ----
    if show_perm:
        _render_permanent(coupons)


def _render_permanent(coupons: pd.DataFrame):
    st.divider()
    st.markdown("### 🪪 Trajni kodovi — influenceri, podcast, gift, kompenzacije")
    st.caption("Ovo nisu marketing kampanje koje se planiraju — to su personalni/"
                "trajno aktivni kodovi koji generiraju webshop prodaju kroz cijelu godinu.")
    perm = permanent_codes(coupons)
    if not perm:
        st.info("Nema F-type kupona.")
        return
    pdf = pd.DataFrame(perm)
    pdf = pdf[["code", "name", "first", "last", "days_active",
                "orders", "units", "skus", "discount", "rev_after"]]
    pdf.columns = ["Kod", "Naziv", "Od", "Do", "Dana",
                    "Orders", "Units", "#SKU", "Popust €", "Revenue (after) €"]
    st.dataframe(pdf, use_container_width=True, hide_index=True)
