from __future__ import annotations

import logging
from datetime import date
from typing import Any

from app.core.postgres.base import BasePostgresClient
from app.core.postgres.project_crud_repository import ProjectCrudRepository

from .docx_generator import build_docx_buffer
from .html_template import render_dossier_html_document
from .ipc_calculator import IpcCalculatorMixin

logger = logging.getLogger(__name__)


class DossierGeneratorService(IpcCalculatorMixin):
    """Enterprise service for generating pre-filled KCS and legal document templates."""

    def __init__(self, repo: ProjectCrudRepository | None = None) -> None:
        self.repo = repo or ProjectCrudRepository()

    def generate_dossier_template(
        self,
        finding_id: str,
        template_type: str = "bien_ban_nghiem_thu_noi_bo",
    ) -> dict[str, Any]:
        """Tự động sinh tài liệu điền sẵn thông tin hợp đồng cho hồ sơ còn thiếu."""
        sql_finding = """
            SELECT f.*, r.project_code
            FROM dossier_review_findings f
            JOIN dossier_review_sessions r ON f.review_session_id = r.review_session_id
            WHERE f.id = %s OR f.finding_code = %s;
        """
        finding = None
        with self.repo.get_connection() as conn, conn.cursor() as cur:
            cur.execute(sql_finding, (finding_id, finding_id))
            finding = cur.fetchone()

        if not finding:
            return {"error": "Không tìm thấy điểm thiếu sót hồ sơ"}

        project_code = finding["project_code"]
        doc_type = finding["document_type"]

        project = self.repo.get_project_detail(project_code)
        if not project:
            return {"error": "Không tìm thấy dự án tương ứng"}

        project_name = project.get("project_name") or "Dự án Thủy lợi & Hạ tầng"
        client_name = project.get("client_name") or "UBND Huyện / Ban QLDA"
        contract_number = project.get("contract_number") or "Số 08/2026/HĐ-XD"
        location = project.get("location") or "Hải Phòng"
        signing_date = project.get("contract_signing_date") or date.today().strftime(
            "%Y-%m-%d"
        )

        doc_title = "BIÊN BẢN NGHIỆM THU NỘI BỘ"
        if (
            "bien_ban_nghiem_thu_noi_bo" in template_type
            or "nghiem_thu" in doc_type.lower()
        ):
            doc_title = "BIÊN BẢN NGHIỆM THU NỘI BỘ CÔNG VIỆC XÂY DỰNG"
        elif "nhat_ky" in doc_type.lower():
            doc_title = "NHẬT KÝ THI CÔNG HIỆN TRƯỜNG"
        elif "phap_ly" in doc_type.lower() or "hop_dong" in doc_type.lower():
            doc_title = "BIÊN BẢN THƯƠNG THẢO HỢP ĐỒNG"

        html_content = render_dossier_html_document(
            doc_title=doc_title,
            project_name=project_name,
            contract_number=contract_number,
            signing_date=signing_date,
            client_name=client_name,
            location=location,
        )
        docx_buf = build_docx_buffer(
            doc_title=doc_title,
            project_name=project_name,
            contract_number=contract_number,
            client_name=client_name,
            location=location,
        )

        return {
            "finding_id": finding_id,
            "project_code": project_code,
            "document_title": doc_title,
            "template_type": template_type,
            "html_preview": html_content,
            "has_docx_export": docx_buf is not None,
            "generated_filename": f"{project_code}_{doc_type}.html",
        }
