from __future__ import annotations

from decimal import Decimal

from app.models.four_pillars_schemas import (
    MaterialLossAuditRecord,
    QualityCertAuditSummaryResponse,
    QualityCertificateAuditItem,
    QualityCertStatus,
)


class MaterialsPillarMixin:
    """Trụ cột 4: Mua bán Vật tư & San lấp mặt bằng."""

    def audit_material_loss(
        self, supplier_tax_id: str = "0201805660"
    ) -> list[MaterialLossAuditRecord]:
        """Kiểm toán tỷ lệ hao hụt vật tư Cát, Đá, Xi măng mua từ Cty Trung Kiên theo Định mức 12/2021/BXD."""
        records = [
            MaterialLossAuditRecord(
                supplier_tax_id=supplier_tax_id,
                supplier_name="Công ty Cổ phần Xây dựng Thương mại và Dịch vụ Trung Kiên",
                material_code="MAT-CAT-DEN",
                material_name="Cát đen san lấp mặt bằng",
                unit="m³",
                purchased_quantity=Decimal("12000.0000"),
                site_received_quantity=Decimal("11700.0000"),
                actual_loss_quantity=Decimal("300.0000"),
                actual_loss_rate_pct=Decimal("2.5000"),
                standard_loss_norm_pct=Decimal("3.0000"),
                loss_variance_pct=Decimal("-0.5000"),
                is_within_norm=True,
                financial_loss_impact_vnd=Decimal("36000000.0000"),  # 300m3 * 120k
            ),
            MaterialLossAuditRecord(
                supplier_tax_id=supplier_tax_id,
                supplier_name="Công ty Cổ phần Xây dựng Thương mại và Dịch vụ Trung Kiên",
                material_code="MAT-DA-BASE",
                material_name="Đá dăm cấp phối Base loại 1",
                unit="m³",
                purchased_quantity=Decimal("4500.0000"),
                site_received_quantity=Decimal("4420.0000"),
                actual_loss_quantity=Decimal("80.0000"),
                actual_loss_rate_pct=Decimal("1.7778"),
                standard_loss_norm_pct=Decimal("2.0000"),
                loss_variance_pct=Decimal("-0.2222"),
                is_within_norm=True,
                financial_loss_impact_vnd=Decimal("22400000.0000"),  # 80m3 * 280k
            ),
        ]
        return records

    def audit_quality_certificates(self) -> QualityCertAuditSummaryResponse:
        """Kiểm toán điều kiện thanh toán: Chứng chỉ xuất xưởng (CO/CQ) & Thí nghiệm nén mẫu R28 / Kéo thép."""
        items = [
            QualityCertificateAuditItem(
                invoice_number="HD-TK-00892",
                material_name="Cát vàng đổ bê tông mô đun độ lớn > 2.0",
                supplier_tax_id="0201805660",
                supplier_name="Công ty Cổ phần Xây dựng Thương mại và Dịch vụ Trung Kiên",
                co_cq_status=QualityCertStatus.VALID,
                concrete_r28_test_status=QualityCertStatus.VALID,
                steel_tensile_test_status=QualityCertStatus.VALID,
                payment_cleared=True,
                audit_notes="Hồ sơ chất lượng hoàn chỉnh: Có chứng nhận mỏ cát Sông Lô và kết quả nén mẫu R28 đạt M300.",
            ),
            QualityCertificateAuditItem(
                invoice_number="HD-TK-00914",
                material_name="Đá 1x2 đổ bê tông dầm cống hộp",
                supplier_tax_id="0201805660",
                supplier_name="Công ty Cổ phần Xây dựng Thương mại và Dịch vụ Trung Kiên",
                co_cq_status=QualityCertStatus.VALID,
                concrete_r28_test_status=QualityCertStatus.VALID,
                steel_tensile_test_status=QualityCertStatus.VALID,
                payment_cleared=True,
                audit_notes="Thí nghiệm thành phần hạt và độ nén dập đạt chuẩn TCVN 7570:2006.",
            ),
            QualityCertificateAuditItem(
                invoice_number="HD-PENDING-0012",
                material_name="Cốt thép CB400-V phi 18 Hòa Phát",
                supplier_tax_id="0201805660",
                supplier_name="Công ty Cổ phần Xây dựng Thương mại và Dịch vụ Trung Kiên",
                co_cq_status=QualityCertStatus.VALID,
                concrete_r28_test_status=QualityCertStatus.VALID,
                steel_tensile_test_status=QualityCertStatus.MISSING,
                payment_cleared=False,
                audit_notes="TẠM GIỮ THANH TOÁN: Đang chờ phiếu thí nghiệm kéo uốn cốt thép từ LAS-XD Hải Phòng.",
            ),
        ]

        missing_test = sum(
            1
            for item in items
            if item.steel_tensile_test_status != QualityCertStatus.VALID
            or item.concrete_r28_test_status != QualityCertStatus.VALID
        )
        missing_cocq = sum(
            1 for item in items if item.co_cq_status != QualityCertStatus.VALID
        )
        fully_comp = sum(1 for item in items if item.payment_cleared)

        return QualityCertAuditSummaryResponse(
            total_invoices_audited=len(items),
            fully_compliant_count=fully_comp,
            missing_cocq_count=missing_cocq,
            missing_lab_test_count=missing_test,
            held_payments_value_vnd=Decimal("185000000.0000"),
            records=items,
        )
