#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CumulMetaDelta-Kor — OPTIONAL Streamlit UI.

NOTE: This is an OPTIONAL richer UI. It is NOT the verifiable entry point.
The verifiable entry point is `main.py` (CLI). This file only reuses the
pure-stdlib meta-analysis engine from main.py; it adds no new math.

Run:  streamlit run app.py
(Streamlit must be installed; the CLI does not require it.)

참고용/연구용 (research/reference only — NOT for clinical decisions).
Data are SYNTHETIC demo trials.
"""

import os

import streamlit as st  # optional dependency; CLI does not need this

import main as engine  # reuse the offline meta-analysis engine


DATA_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),
                         "data", "trials.json")


def cumulative_rows(cell_trials):
    """Build per-step cumulative meta rows + transition events for a cell."""
    rows = []
    prev_state, prev_res = None, None
    for i in range(len(cell_trials)):
        sub = cell_trials[:i + 1]
        res = engine.meta_analyze(sub)
        state = engine.derive_state(res)
        t = cell_trials[i]
        events = engine.detect_transitions(prev_state, prev_res, state, res)
        rows.append({
            "year": t["year"],
            "trial_id": t["trial_id"],
            "trial": t["trial_name"],
            "this_HR": "%.2f (%.2f–%.2f)" % (t["effect"], t["ci_low"], t["ci_high"]),
            "cumul_RE": "%.2f" % res["random_effect"],
            "cumul_CI": engine.fmt_ci(res["random_ci"]),
            "I2_%": "%.0f" % (res["I2"] * 100),
            "significant": "✓" if state["significant"] else "",
            "GRADE": state["grade_label"],
            "alerts": events,
            "source": t["source"],
            "n": t.get("n", "?"),
        })
        prev_state, prev_res = state, res
    return rows


def render():
    st.set_page_config(page_title="CumulMetaDelta-Kor", layout="wide")
    st.title("CumulMetaDelta-Kor / 큐뮬메타델타워치코어")
    st.caption("누적 메타분석 기반 당뇨 약물군 RCT 임계전이 알림 · Domain: DM · 연구 알림")
    st.warning(engine.DISCLAIMER)

    trials = engine.load_trials(DATA_PATH)
    cells = engine.group_into_cells(trials)
    keys = sorted(cells)
    labels = ["%s × %s  (k=%d)" % (k[0], k[1], len(cells[k])) for k in keys]

    choice = st.sidebar.selectbox("Cell (drug_class × outcome)", range(len(keys)),
                                  format_func=lambda i: labels[i])
    key = keys[choice]
    cell_trials = cells[key]

    st.subheader("CELL: %s × %s" % key)
    rows = cumulative_rows(cell_trials)

    final = engine.meta_analyze(cell_trials)
    fstate = engine.derive_state(final)
    c1, c2, c3, c4 = st.columns(4)
    c1.metric("Pooled RR/HR (RE)", "%.3f" % final["random_effect"], engine.fmt_ci(final["random_ci"]))
    c2.metric("I²", "%.0f%%" % (final["I2"] * 100), fstate["i2_band"])
    c3.metric("τ²", "%.4f" % final["tau2"])
    c4.metric("GRADE", fstate["grade_label"])

    st.markdown("**Cumulative forest** (each row = pooled estimate after adding that trial):")
    table = [{k: v for k, v in r.items() if k != "alerts"} for r in rows]
    st.dataframe(table, use_container_width=True)

    st.markdown("### 🔔 Transition alert log")
    any_alert = False
    for r in rows:
        for ev in r["alerts"]:
            any_alert = True
            st.error("**%d %s** — %s\n\n↳ trace: %s | %s | n=%s"
                     % (r["year"], r["trial_id"], ev, r["trial"], r["source"], r["n"]))
    if not any_alert:
        st.info("이 셀에서는 임계 전이가 발생하지 않았습니다.")


if __name__ == "__main__":
    render()
