"""Результати оцінювання — перегляд та завантаження PDF."""
from __future__ import annotations

import streamlit as st

from export.pdf import generate_pdf
from services.results import get_assessment_summary, get_class_results, get_nonconformities
from ui.guard import require_role

require_role("Expert", "Admin", "CompanyRep")

aid = st.session_state.get("assessment_id")
if not aid:
    st.warning("Оцінювання не обрано. Перейдіть на сторінку Експерта.")
    st.stop()

summary = get_assessment_summary(aid)
if not summary:
    st.error(f"Оцінювання #{aid} не знайдено.")
    st.stop()

if summary["status"] == "draft":
    st.warning("Оцінювання ще не прораховано. Поверніться до анкети та запустіть оцінювання.")
    st.stop()

_LEVEL_LABEL = {1: "Рівень 1", 2: "Рівень 2", 3: "Рівень 3"}
_LEVEL_ICON = {1: "🟡", 2: "🟢", 3: "🏆"}
level = summary["certification_level"]

st.title(f"Результат оцінювання — {summary['company']}")

col1, col2, col3 = st.columns(3)
col1.metric("Дата", str(summary["date"]))
col2.metric("Експерт", summary["expert"] or "—")
if level:
    col3.metric("Рівень сертифікації", f"{_LEVEL_ICON.get(level, '')} {_LEVEL_LABEL.get(level, str(level))}")
else:
    col3.metric("Рівень сертифікації", "🔴 Не сертифіковано")

st.divider()

# §С.6.2: індекси по класах
st.subheader("Індекси відповідності по класах")
class_results = get_class_results(aid)
for row in class_results:
    pct = row["index"]
    label = f"Клас {row['class']} — {row['name']} ({row['met']}/{row['total']})"
    st.progress(pct, text=f"{label}: {pct:.1%}")

st.divider()

# §С.6.1: невідповідності
st.subheader("Невідповідності")
ncs = get_nonconformities(aid)

if not ncs:
    st.success("✅ Невідповідностей не виявлено.")
else:
    critical = [nc for nc in ncs if nc["is_critical"]]
    non_critical = [nc for nc in ncs if not nc["is_critical"]]

    if critical:
        st.error(f"🔴 Критичні невідповідності: {len(critical)}")
        st.dataframe(
            [{"Код": nc["code"], "Критичність": nc["severity"],
              "Термін усунення": str(nc["deadline"]), "Рекомендація": nc["recommendation"]}
             for nc in critical],
            use_container_width=True, hide_index=True,
        )

    if non_critical:
        st.warning(f"🟡 Некритичні невідповідності: {len(non_critical)}")
        st.dataframe(
            [{"Код": nc["code"], "Критичність": nc["severity"],
              "Термін усунення": str(nc["deadline"]), "Рекомендація": nc["recommendation"]}
             for nc in non_critical],
            use_container_width=True, hide_index=True,
        )

st.divider()

# §С.7.3: завантаження PDF
pdf_bytes = generate_pdf(
    company=summary["company"],
    assessment_date=summary["date"],
    expert=summary["expert"],
    certification_level=level,
    class_results=class_results,
    nonconformities=ncs,
)
safe_name = summary["company"].replace(" ", "_").replace("/", "-")
st.download_button(
    label="⬇ Завантажити звіт PDF",
    data=pdf_bytes,
    file_name=f"zvit_{safe_name}_{summary['date']}.pdf",
    mime="application/pdf",
    type="primary",
)

st.divider()

if st.button("🔄 Нове оцінювання"):
    st.session_state.assessment_id = None
    st.session_state.questionnaire_answers = {}
    st.switch_page("pages/expert.py")
