"""Анкета оцінювання — Expert."""
from __future__ import annotations

from datetime import date

import streamlit as st

from services.assessment import (
    create_assessment,
    get_companies,
    get_requirements_by_class,
    run_assessment,
    save_answers,
)
from ui.guard import require_role

require_role("Expert")

if "assessment_id" not in st.session_state:
    st.session_state.assessment_id = None
if "questionnaire_answers" not in st.session_state:
    st.session_state.questionnaire_answers = {}

# ── Крок 1: Створення оцінювання ─────────────────────────────────────────────
if st.session_state.assessment_id is None:
    st.title("Експерт — Нове оцінювання")

    companies = get_companies()
    if not companies:
        st.warning("Компаній у системі ще немає. Зверніться до Адміністратора.")
        st.stop()

    company_options = {c.name: c.id for c in companies}

    with st.form("new_assessment"):
        st.subheader("Створити оцінювання")
        company_name = st.selectbox("Компанія", options=list(company_options.keys()))
        assessment_date = st.date_input("Дата оцінювання", value=date.today())
        submitted = st.form_submit_button("Розпочати оцінювання")

    if submitted:
        expert_email = st.session_state.get("user_email", "невідомо")
        aid = create_assessment(
            company_id=company_options[company_name],
            assessment_date=assessment_date,
            expert=expert_email,
        )
        st.session_state.assessment_id = aid
        st.rerun()

    st.stop()

# ── Крок 2: Анкета ────────────────────────────────────────────────────────────
aid = st.session_state.assessment_id
st.title(f"Анкета оцінювання #{aid}")

if st.session_state.questionnaire_answers:
    n = len(st.session_state.questionnaire_answers)
    st.success(f"Збережено {n} відповідей для оцінювання #{aid}.")
    col_run, col_new = st.columns(2)
    with col_run:
        if st.button("▶ Запустити оцінювання", type="primary"):
            with st.spinner("Розраховуємо…"):
                run_assessment(aid)
            st.switch_page("pages/results.py")
    with col_new:
        if st.button("🔄 Нове оцінювання"):
            st.session_state.assessment_id = None
            st.session_state.questionnaire_answers = {}
            st.rerun()
    st.stop()

classes_with_reqs = get_requirements_by_class()
req_keys: list[tuple[object, str]] = []
for tc, reqs in classes_with_reqs:
    for req in reqs:
        req_keys.append((req, f"q_{req.id}"))

with st.form("questionnaire"):
    for tc, reqs in classes_with_reqs:
        st.subheader(f"Клас {tc.code} — {tc.name}")
        for req in reqs:
            key = f"q_{req.id}"
            label = f"**{req.code}** — {req.recommendation or ''}"
            hint = f"Оператор: `{req.operator}`, поріг: `{req.threshold}`"

            if req.operator == "yes-no":
                default_idx = 0 if req.threshold.lower() == "yes" else 1
                st.radio(label, options=["yes", "no"], index=default_idx,
                         key=key, help=hint, horizontal=True)
            else:
                try:
                    threshold_val = float(req.threshold)
                except ValueError:
                    threshold_val = 0.0
                st.number_input(label, value=threshold_val, min_value=0.0,
                                key=key, help=hint)
        st.divider()

    submitted = st.form_submit_button("Зберегти відповіді")

if submitted:
    answers = {req.id: str(st.session_state[key]) for req, key in req_keys}
    save_answers(aid, answers)
    st.session_state.questionnaire_answers = answers
    st.rerun()
