from __future__ import annotations

import logging
from datetime import date, datetime
from typing import Any

logger = logging.getLogger(__name__)


class ContractComplianceMixin:
    """Rà soát sự tuân thủ hợp đồng dựa trên chuẩn FIDIC 14.3."""

    def check_fidic_14_3_compliance(self, project_code: str, application_date: date) -> dict[str, Any]:
        """
        Kiểm tra tuân thủ điều khoản FIDIC 14.3 (Application for Interim Payment Certificates).
        Quy định: IPC phải nộp kèm Báo cáo khối lượng hoàn thành. Chậm trễ > 28 ngày so với cuối kỳ sẽ bị cảnh báo đỏ.
        """
        sql = "SELECT id, project_code, end_date FROM erp_projects WHERE project_code = %s LIMIT 1"
        project = None
        try:
            with self._postgres_client.pool.connection() as conn, conn.cursor() as cur:
                cur.execute(sql, (project_code,))
                project = cur.fetchone()
        except Exception:
            pass
            
        if not project:
            return {"status": "error", "message": "Dự án không tồn tại."}

        # Mock logic based on real DB values (project start/end date, milestones)
        end_date_str = project.get("end_date")
        if not end_date_str:
            return {"status": "warning", "message": "Dự án chưa cập nhật ngày kết thúc."}

        if isinstance(end_date_str, str):
            try:
                end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date()
            except ValueError:
                return {"status": "warning", "message": "Ngày kết thúc không đúng định dạng."}
        else:
            end_date = end_date_str

        delay_days = (application_date - end_date).days

        compliance = {
            "project_code": project_code,
            "fidic_clause": "14.3",
            "delay_days": max(0, delay_days),
        }

        if delay_days > 28:
            compliance["status"] = "NON_COMPLIANT"
            compliance["severity"] = "CRITICAL"
            compliance["message"] = f"Hồ sơ thanh toán nộp trễ {delay_days} ngày. Vi phạm thời hạn 28 ngày theo FIDIC 14.3."
        elif delay_days > 0:
            compliance["status"] = "WARNING"
            compliance["severity"] = "HIGH"
            compliance["message"] = f"Hồ sơ thanh toán nộp trễ {delay_days} ngày. Cần đốc thúc thanh toán ngay."
        else:
            compliance["status"] = "COMPLIANT"
            compliance["severity"] = "SAFE"
            compliance["message"] = "Hồ sơ nộp đúng hạn, tuân thủ FIDIC 14.3."

        return compliance
