"""Operon Developmental Staging Dashboard."""

from __future__ import annotations
from enum import Enum

import gradio as gr


class Stage(Enum):
    EMBRYONIC = "embryonic"
    JUVENILE = "juvenile"
    ADOLESCENT = "adolescent"
    MATURE = "mature"

STAGES = [Stage.EMBRYONIC, Stage.JUVENILE, Stage.ADOLESCENT, Stage.MATURE]
PLASTICITY = {Stage.EMBRYONIC: 1.0, Stage.JUVENILE: 0.75, Stage.ADOLESCENT: 0.5, Stage.MATURE: 0.25}
COLORS = {Stage.EMBRYONIC: "#4ade80", Stage.JUVENILE: "#60a5fa", Stage.ADOLESCENT: "#f59e0b", Stage.MATURE: "#a78bfa"}

CRITICAL_PERIODS = [
    ("rapid_learning", Stage.EMBRYONIC, Stage.JUVENILE, "Fast template adoption from peers"),
    ("tool_exploration", Stage.JUVENILE, Stage.ADOLESCENT, "Try new tools freely"),
    ("social_bonding", Stage.EMBRYONIC, Stage.ADOLESCENT, "Form trust with peers"),
]

TOOLS = [
    ("basic_tool", Stage.EMBRYONIC, "Simple text processing"),
    ("analyzer", Stage.JUVENILE, "Data analysis toolkit"),
    ("planner", Stage.ADOLESCENT, "Strategic planning"),
    ("orchestrator", Stage.MATURE, "Full multi-agent orchestration"),
]


def _get_stage(consumed_frac, juv_t, adol_t, mat_t):
    if consumed_frac >= mat_t / 100: return Stage.MATURE
    if consumed_frac >= adol_t / 100: return Stage.ADOLESCENT
    if consumed_frac >= juv_t / 100: return Stage.JUVENILE
    return Stage.EMBRYONIC


def _run_lifecycle(max_ops, juv_t, adol_t, mat_t):
    rows = ""
    last = None
    transitions = []
    for tick in range(1, int(max_ops) + 1):
        consumed = tick / max_ops
        stage = _get_stage(consumed, juv_t, adol_t, mat_t)
        if stage != last:
            if last is not None:
                transitions.append((tick, last, stage))
            last = stage

    for tick, old, new in transitions:
        color = COLORS[new]
        rows += f"""<tr>
            <td style="padding:8px">Tick {tick}</td>
            <td style="padding:8px;color:{COLORS[old]}">{old.value}</td>
            <td style="padding:8px">&rarr;</td>
            <td style="padding:8px;color:{color};font-weight:600">{new.value}</td>
            <td style="padding:8px">{PLASTICITY[new]:.2f}</td>
        </tr>"""

    table = f"""<table style="width:100%;border-collapse:collapse;font-size:14px">
        <thead><tr style="border-bottom:2px solid #333">
            <th scope="col" style="text-align:left;padding:8px">Tick</th>
            <th scope="col" style="text-align:left;padding:8px">From</th>
            <th scope="col" aria-label="Transition"></th>
            <th scope="col" style="text-align:left;padding:8px">To</th>
            <th scope="col" style="text-align:left;padding:8px">Plasticity</th>
        </tr></thead>
        <tbody>{rows}</tbody>
    </table>"""

    # Critical periods
    final_stage = _get_stage(1.0, juv_t, adol_t, mat_t)
    cp_rows = ""
    stage_order = {s: i for i, s in enumerate(STAGES)}
    for name, opens, closes, desc in CRITICAL_PERIODS:
        is_closed = stage_order[final_stage] >= stage_order[closes]
        status = "CLOSED" if is_closed else "OPEN"
        color = "#a44" if is_closed else "#4a4"
        cp_rows += f"""<tr>
            <td style="padding:8px">{name}</td>
            <td style="padding:8px">{opens.value} → {closes.value}</td>
            <td style="padding:8px;color:{color};font-weight:600">{status}</td>
            <td style="padding:8px;font-size:12px;color:#888">{desc}</td>
        </tr>"""

    cp_table = f"""<h3 style="margin-top:24px">Critical Periods at MATURE</h3>
    <table style="width:100%;border-collapse:collapse;font-size:14px">
        <thead><tr style="border-bottom:2px solid #333">
            <th scope="col" style="text-align:left;padding:8px">Period</th>
            <th scope="col" style="text-align:left;padding:8px">Window</th>
            <th scope="col" style="text-align:left;padding:8px">Status</th>
            <th scope="col" style="text-align:left;padding:8px">Description</th>
        </tr></thead>
        <tbody>{cp_rows}</tbody>
    </table>"""

    # Tools
    tool_rows = ""
    for name, min_stage, desc in TOOLS:
        can_acquire = stage_order[final_stage] >= stage_order[min_stage]
        color = "#4a4" if can_acquire else "#a44"
        tool_rows += f"""<tr>
            <td style="padding:8px">{name}</td>
            <td style="padding:8px">{min_stage.value}</td>
            <td style="padding:8px;color:{color};font-weight:600">{'AVAILABLE' if can_acquire else 'LOCKED'}</td>
            <td style="padding:8px;font-size:12px;color:#888">{desc}</td>
        </tr>"""

    tool_table = f"""<h3 style="margin-top:24px">Capability Gating at MATURE</h3>
    <table style="width:100%;border-collapse:collapse;font-size:14px">
        <thead><tr style="border-bottom:2px solid #333">
            <th scope="col" style="text-align:left;padding:8px">Tool</th>
            <th scope="col" style="text-align:left;padding:8px">Min Stage</th>
            <th scope="col" style="text-align:left;padding:8px">Status</th>
            <th scope="col" style="text-align:left;padding:8px">Description</th>
        </tr></thead>
        <tbody>{tool_rows}</tbody>
    </table>"""

    return table + cp_table + tool_table


def build_app():
    with gr.Blocks(title="Operon Developmental Staging", theme=gr.themes.Base()) as demo:
        gr.Markdown("# Operon Developmental Staging\nLifecycle progression, critical periods, and capability gating.")

        max_ops = gr.Slider(minimum=10, maximum=500, value=100, step=10, label="Max Operations")
        juv = gr.Slider(minimum=1, maximum=50, value=10, step=1, label="Juvenile Threshold (%)")
        adol = gr.Slider(minimum=10, maximum=80, value=35, step=5, label="Adolescent Threshold (%)")
        mat = gr.Slider(minimum=30, maximum=95, value=70, step=5, label="Mature Threshold (%)")
        btn = gr.Button("Run Lifecycle")
        out = gr.HTML()
        btn.click(_run_lifecycle, inputs=[max_ops, juv, adol, mat], outputs=[out])

    return demo


if __name__ == "__main__":
    app = build_app()
    app.launch()
