"""Dossier review workflow service with optional PostgreSQL backing."""

from __future__ import annotations

from app.core.postgres import PostgresClient
from app.models.schemas import (
    DossierReviewAssignmentItem,
    DossierReviewFindingItem,
    DossierReviewSessionRecord,
    DossierReviewSessionsResponse,
    DossierReviewSubmissionItem,
)


def build_fallback_dossier_review_response(
    message: str | None = None,
) -> DossierReviewSessionsResponse:
    """Return an empty fallback response when PostgreSQL is unavailable."""
    return DossierReviewSessionsResponse(
        items=[],
        source="fallback",
        used_fallback=True,
        message=message,
    )


class DossierReviewService:
    """Service helpers for dossier review sessions, findings, assignments, and verification."""

    def __init__(self, postgres_client: PostgresClient | None = None) -> None:
        self._postgres_client = postgres_client or PostgresClient()

    def get_review_sessions(
        self,
        project_code: str | None = None,
        review_id: str | None = None,
    ) -> DossierReviewSessionsResponse:
        """Return dossier review sessions from PostgreSQL with safe fallback behavior."""
        if not self._postgres_client.is_enabled():
            return build_fallback_dossier_review_response(
                "PostgreSQL chưa được cấu hình. Chưa thể tải review workflow."
            )

        try:
            items = self._postgres_client.fetch_dossier_review_sessions(
                project_code=project_code,
                review_id=review_id,
            )
        except Exception as exc:
            return build_fallback_dossier_review_response(
                f"Không thể kết nối PostgreSQL để tải review workflow. Chi tiết: {exc}"
            )

        return DossierReviewSessionsResponse(
            items=[DossierReviewSessionRecord(**item) for item in items],
            source="postgres",
            used_fallback=False,
            message=None,
        )

    def create_review_session(self, payload: dict) -> DossierReviewSessionRecord:
        """Create a dossier review session in PostgreSQL."""
        self._ensure_postgres_enabled()

        session = self._postgres_client.create_dossier_review_session(payload)
        return DossierReviewSessionRecord(**session)

    def create_finding(self, review_id: str, payload: dict) -> DossierReviewFindingItem:
        """Create a dossier review finding in PostgreSQL."""
        self._ensure_postgres_enabled()

        finding = self._postgres_client.create_dossier_review_finding(
            review_id, payload
        )
        return DossierReviewFindingItem(**finding)

    def assign_finding(
        self, review_id: str, finding_id: str, payload: dict
    ) -> DossierReviewAssignmentItem:
        """Assign a dossier review finding to a department or employee."""
        self._ensure_postgres_enabled()

        assignment = self._postgres_client.assign_dossier_review_finding(
            review_id, finding_id, payload
        )
        return DossierReviewAssignmentItem(**assignment)

    def submit_supplement(
        self,
        review_id: str,
        finding_id: str,
        payload: dict,
    ) -> DossierReviewSubmissionItem:
        """Record a supplement submission for a dossier review assignment."""
        self._ensure_postgres_enabled()

        submission = self._postgres_client.submit_dossier_review_supplement(
            review_id, finding_id, payload
        )
        return DossierReviewSubmissionItem(**submission)

    def verify_finding(
        self, review_id: str, finding_id: str, payload: dict
    ) -> DossierReviewFindingItem:
        """Verify a dossier review finding after supplement submission."""
        self._ensure_postgres_enabled()

        finding = self._postgres_client.verify_dossier_review_finding(
            review_id, finding_id, payload
        )
        return DossierReviewFindingItem(**finding)

    def _ensure_postgres_enabled(self) -> None:
        if not self._postgres_client.is_enabled():
            raise ValueError(
                "PostgreSQL chưa được cấu hình. Không thể ghi dossier review workflow."
            )
