from __future__ import annotations

from datetime import datetime
from decimal import Decimal
from typing import Any

from pydantic import BaseModel, Field


class GroundTruthRow(BaseModel):
    """Bản ghi đối chứng chuẩn từ file dự toán Kỹ sư (Ground Truth)."""

    stt: str = ""
    drawing_symbol: str | None = None
    norm_code: str | None = None
    task_name: str
    unit: str
    quantity: Decimal
    formula_breakdown: str | None = None
    notes: str | None = None


class TakeoffItemEvaluation(BaseModel):
    """Đánh giá chi tiết từng dòng bóc tách so với chuẩn đối chứng."""

    task_name: str
    norm_code: str | None = None
    unit: str
    expected_quantity: Decimal
    actual_quantity: Decimal
    deviation_pct: Decimal
    formula_present: bool = False
    formula_breakdown: str | None = None
    match_status: str = (
        "EXACT_MATCH"  # EXACT_MATCH, MINOR_DEVIATION, MAJOR_DEVIATION, MISSED
    )
    error_cause: str | None = None


class QSDrillScorecard(BaseModel):
    """Bảng điểm năng lực bóc tách BoQ của AI Quỳnh cho một bài tập."""

    drill_id: str
    project_name: str
    project_code: str
    total_ground_truth_items: int = 0
    matched_items: int = 0
    recall_rate_pct: Decimal = Field(default=Decimal("0.0"))
    precision_rate_pct: Decimal = Field(default=Decimal("0.0"))
    volume_mae_pct: Decimal = Field(default=Decimal("0.0"))
    formula_coverage_pct: Decimal = Field(default=Decimal("0.0"))
    overall_grade: str = "A"  # S, A, B, C, F
    is_production_ready: bool = False
    evaluated_items: list[TakeoffItemEvaluation] = Field(default_factory=list)
    evaluated_at: str = Field(default_factory=lambda: datetime.now().isoformat())


class TrainingEpochResult(BaseModel):
    """Kết quả một vòng lặp huấn luyện tự trị."""

    epoch: int
    drill_id: str
    scorecard: QSDrillScorecard
    synthesized_rules: list[dict[str, Any]] = Field(default_factory=list)
    improvement_notes: str = ""


class QSDrillDefinition(BaseModel):
    """Định nghĩa bài tập kiểm chuẩn từ kho HĐ-2026."""

    drill_id: str
    project_name: str
    project_code: str
    drawing_path: str
    ground_truth_excel_path: str
    domain_type: str = (
        "CIVIL_BUILDING"  # CIVIL_BUILDING, IRRIGATION_CULVERT, ROAD_EARTHWORK
    )
    description: str
    target_accuracy_pct: Decimal = Field(default=Decimal("95.0"))
