"""9-таблична SQLModel-схема доменної моделі ШТУ — без Streamlit та бізнес-логіки."""
from __future__ import annotations

from datetime import date, datetime

from sqlmodel import Field, SQLModel


class Companies(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    edrpou: str | None = Field(default=None, index=True)  # унікальний держреєстраційний номер
    contact_email: str | None = None
    contact_person: str | None = None


class TechnologyClasses(SQLModel, table=True):
    """Класи I–IV: IoT / ШІ-запаси / Трасування / Автономні системи."""

    id: int | None = Field(default=None, primary_key=True)
    code: str = Field(unique=True)   # "I" / "II" / "III" / "IV"
    name: str
    description: str | None = None


class Requirements(SQLModel, table=True):
    """Редаговані правила — пороги живуть у БД, не в коді."""

    id: int | None = Field(default=None, primary_key=True)
    code: str = Field(unique=True)
    class_id: int = Field(foreign_key="technologyclasses.id", index=True)
    threshold: str                           # числовий рядок або "yes"/"no"
    operator: str                            # >=, <=, =, yes-no
    mandatory: bool = False
    criticality: int = 1                     # 1–5; ≥3 → критична НВ (§С.5.4)
    deadline_days: int = 30
    recommendation: str | None = None


class Assessments(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    company_id: int = Field(foreign_key="companies.id", index=True)
    assessment_date: date = Field(default_factory=date.today)
    expert: str | None = None
    status: str = "draft"                    # draft → scored → certified
    certification_level: int | None = None  # 1/2/3 або None


class AssessmentResults(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    assessment_id: int = Field(foreign_key="assessments.id", index=True)
    requirement_id: int = Field(foreign_key="requirements.id", index=True)
    value: str | None = None
    meets: bool | None = None               # NULL до запуску scoring engine
    index_contribution: float | None = None


class Nonconformities(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    assessment_id: int = Field(foreign_key="assessments.id", index=True)
    requirement_id: int = Field(foreign_key="requirements.id", index=True)
    severity: int = 1                        # копія criticality на момент оцінювання
    deadline: date | None = None
    recommendation: str | None = None


class CertificationLevels(SQLModel, table=True):
    """Межі рівнів 1/2/3 — двовимірний алгоритм §С.4.6."""

    id: int | None = Field(default=None, primary_key=True)
    level: int = Field(unique=True)          # 1 / 2 / 3
    name: str | None = None
    class_min_index: float
    overall_min_index: float
    class_scope: str = "ALL"                 # "ALL" або "I,II" тощо
    critical_threshold: int = 3             # criticality ≥ цього → критична НВ


class Reports(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    assessment_id: int = Field(foreign_key="assessments.id", index=True)
    path: str
    format: str = "pdf"
    generated_at: datetime = Field(default_factory=datetime.now)


class AuditSchedule(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    company_id: int = Field(foreign_key="companies.id", index=True)
    planned_date: date
    status: str = "planned"                  # planned / done / cancelled
    note: str | None = None
