from __future__ import annotations

import json
import logging
from datetime import date
from typing import Any

from app.modules.core.domain.document_taxonomy import get_group_for_type

logger = logging.getLogger(__name__)


class ErpDocumentCreateMixin:
    def create_document(self, payload: dict[str, Any]) -> dict[str, Any]:
        """Tạo mới hoặc lưu trữ văn bản công trình."""
        self._ensure_document_columns()
        doc_type = payload.get("document_type", "CV").strip()
        doc_code = payload.get("document_code")
        if not doc_code or doc_code.startswith("AUTO"):
            doc_code = self.get_next_document_code(doc_type)["next_code"]

        doc_group = payload.get("document_group")
        if not doc_group or doc_group == "Văn Bản Hành Chính":
            doc_group = get_group_for_type(doc_type)

        clean_payload = {
            "company_id": payload.get("company_id"),
            "project_id": payload.get("project_id"),
            "document_code": doc_code,
            "document_title": payload["document_title"],
            "document_group": doc_group,
            "document_type": doc_type,
            "category": payload.get("category", "incoming"),
            "issue_date": payload.get("issue_date") or date.today(),
            "issuer_name": payload.get("issuer_name")
            or payload.get("issuing_authority"),
            "signer_name": payload.get("signer_name"),
            "file_path": payload.get("file_path") or payload.get("file_url"),
            "file_url": payload.get("file_url"),
            "file_format": payload.get("file_format", "pdf"),
            "file_size_bytes": payload.get("file_size_bytes", 0),
            "file_hash": payload.get("file_hash"),
            "verification_status": payload.get("verification_status", "verified"),
            "status": payload.get("status", "verified"),
            "ai_analysis_summary": payload.get("ai_analysis_summary")
            or payload.get("summary_content"),
            "summary_content": payload.get("summary_content")
            or payload.get("ai_analysis_summary"),
            "ai_risk_assessment": payload.get("ai_risk_assessment"),
            "ai_legal_references": json.dumps(payload.get("ai_legal_references") or [])
            if isinstance(payload.get("ai_legal_references"), (list, dict))
            else payload.get("ai_legal_references", "[]"),
            "is_gold_reference": payload.get("is_gold_reference", False),
            "version_number": payload.get("version_number", "v1.0"),
            "version_index": payload.get("version_index", 1),
            "is_active_version": payload.get("is_active_version", True),
            "signature_status": payload.get("signature_status", "draft"),
            "document_direction": payload.get("document_direction", "incoming"),
            "partner_tax_code": payload.get("partner_tax_code"),
            "partner_name": payload.get("partner_name"),
            "project_stage": payload.get("project_stage", "stage_01_initiation"),
            "change_summary": payload.get("change_summary"),
            "audit_readiness_score": payload.get("audit_readiness_score", 100),
            "ocr_confidence_score": payload.get("ocr_confidence_score", 85),
            "ocr_validation_flags": json.dumps(
                payload.get("ocr_validation_flags") or []
            )
            if isinstance(payload.get("ocr_validation_flags"), (list, dict))
            else (payload.get("ocr_validation_flags") or "[]"),
            "cross_audit_summary": payload.get("cross_audit_summary"),
            "quarantine_status": payload.get("quarantine_status", "clear"),
            "verified_by_user_id": payload.get("verified_by_user_id"),
            "verified_at": payload.get("verified_at"),
        }

        sql = """
            INSERT INTO erp_documents (
                company_id, project_id, document_code, document_title,
                document_group, document_type, category, issue_date, issuer_name,
                signer_name, file_path, file_url, file_format, file_size_bytes, file_hash,
                verification_status, status, ai_analysis_summary, summary_content,
                ai_risk_assessment, ai_legal_references, is_gold_reference,
                version_number, version_index, is_active_version, signature_status,
                document_direction, partner_tax_code, partner_name, project_stage,
                change_summary, audit_readiness_score,
                ocr_confidence_score, ocr_validation_flags, cross_audit_summary,
                quarantine_status, verified_by_user_id, verified_at
            ) VALUES (
                %(company_id)s, %(project_id)s, %(document_code)s, %(document_title)s,
                %(document_group)s, %(document_type)s, %(category)s, %(issue_date)s, %(issuer_name)s,
                %(signer_name)s, %(file_path)s, %(file_url)s, %(file_format)s, %(file_size_bytes)s, %(file_hash)s,
                %(verification_status)s, %(status)s, %(ai_analysis_summary)s, %(summary_content)s,
                %(ai_risk_assessment)s, %(ai_legal_references)s::jsonb, %(is_gold_reference)s,
                %(version_number)s, %(version_index)s, %(is_active_version)s, %(signature_status)s,
                %(document_direction)s, %(partner_tax_code)s, %(partner_name)s, %(project_stage)s,
                %(change_summary)s, %(audit_readiness_score)s,
                %(ocr_confidence_score)s, %(ocr_validation_flags)s::jsonb, %(cross_audit_summary)s,
                %(quarantine_status)s, %(verified_by_user_id)s, %(verified_at)s
            ) RETURNING *;
        """
        with self.get_connection() as conn:
            with conn.cursor() as cur:
                cur.execute(sql, clean_payload)
                row = cur.fetchone()
                # Default root_document_id to self
                if row and not row.get("root_document_id"):
                    cur.execute(
                        "UPDATE erp_documents SET root_document_id = id WHERE id = %s RETURNING *;",
                        (row["id"],),
                    )
                    row = cur.fetchone()
                conn.commit()
                return row
