from __future__ import annotations

import logging
from typing import Any

logger = logging.getLogger("dscons.company_state.fetchers")


class CompanyStateSafeFetchersMixin:
    """Safe fallback data fetchers for company operational state."""

    def _fetch_dossier_reviews(
        self,
    ) -> tuple[list[dict[str, Any]], str, bool, str | None]:
        """Đọc dossier review an toàn."""
        if not self._postgres_client.is_enabled():
            return (
                [],
                "postgres_disabled",
                True,
                "PostgreSQL chưa được cấu hình nên trạng thái dossier review đang để trống.",
            )
        try:
            items = self._postgres_client.fetch_dossier_review_sessions()
        except Exception as exc:
            return (
                [],
                "unavailable",
                True,
                f"Không thể đọc dữ liệu dossier review từ PostgreSQL. Chi tiết: {exc}",
            )
        if not items:
            return (
                [],
                "postgres",
                False,
                "PostgreSQL chưa có dữ liệu dossier review sessions.",
            )
        return items, "postgres", False, None

    def _safe_get_project_management_data(self) -> Any:
        try:
            return self._project_management_service.get_project_management_data()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp project management data cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    def _safe_get_employee_logs(self) -> Any:
        try:
            return self._employee_logs_service.get_employee_logs()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp employee logs cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    def _safe_list_operations_cases(self) -> Any:
        try:
            return self._operations_case_management_service.list_cases()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp operations cases cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    def _safe_list_operations_actions(self) -> Any:
        try:
            return self._operations_case_management_service.list_actions()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp operations actions cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    def _safe_list_operations_blockers(self) -> Any:
        try:
            return self._operations_case_management_service.list_blockers()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp operations blockers cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    def _safe_list_remediation_plans(self) -> Any:
        try:
            return self._remediation_planning_service.list_plans()
        except Exception as exc:
            return self._build_empty_service_response(
                source="unavailable",
                message=f"Không thể nạp remediation plans cho operational state; đã trả fallback rỗng an toàn. Chi tiết: {exc}",
            )

    @staticmethod
    def _build_empty_service_response(*, source: str, message: str) -> Any:
        """Tạo response rỗng an toàn."""

        class _SafeEmptyResponse:
            def __init__(self, source_value: str, message_value: str) -> None:
                self.items: list[Any] = []
                self.source = source_value
                self.used_fallback = True
                self.message = message_value

        return _SafeEmptyResponse(source, message)
