from __future__ import annotations

from app.core.postgres import PostgresClient
from app.models.schemas import WorkflowReviewStartRequest
from app.modules.operations.application.company_operational_state_service import (
    CompanyOperationalStateService,
)
from app.modules.core.application.workflow_persistence.employee_logs import (
    WorkflowPersistenceEmployeeLogsMixin,
)
from app.modules.core.application.workflow_persistence.retrigger import (
    WorkflowPersistenceRetriggerMixin,
)
from app.modules.core.application.workflow_persistence.wrappers import WorkflowPersistenceWrappersMixin
from app.modules.core.application.workflow_persistence.write_phase import (
    WorkflowPersistenceWritePhaseMixin,
)
from app.modules.core.application.workflow_policy_service import WorkflowPolicyService

WorkflowPersistenceCoreMixin = WorkflowPersistenceWritePhaseMixin


class WorkflowPersistenceService(
    WorkflowPersistenceWritePhaseMixin,
    WorkflowPersistenceRetriggerMixin,
    WorkflowPersistenceEmployeeLogsMixin,
    WorkflowPersistenceWrappersMixin,
):
    """Persist proactive review workflows into review and log tables."""

    def __init__(self, postgres_client: PostgresClient | None = None) -> None:
        self._postgres_client = postgres_client or PostgresClient()
        self._policy_service = WorkflowPolicyService()
        self._company_operational_state_service = CompanyOperationalStateService(
            self._postgres_client
        )

    def start_review_run(self, request: WorkflowReviewStartRequest):
        """Chạy workflow lưu review chính."""
        import app.modules.core.application.workflow_persistence_service as wps

        get_persona_fn = wps.get_persona
        lead_persona = get_persona_fn(request.lead_agent_code)
        policy_checks = self._policy_service.evaluate_start_request(request)
        policy_summary_payload = self._policy_service.summarize_policy_outcome(
            policy_checks
        )
        policy_summary = self._build_policy_summary(
            policy_checks, policy_summary_payload
        )
        trigger_summary = self._build_trigger_summary(request)
        review_code = self._build_review_code(
            project_code=request.project_code,
            lead_agent_code=request.lead_agent_code,
        )
        review_payload = {
            "project_code": request.project_code,
            "review_code": review_code,
            "dossier_scope": request.dossier_scope,
            "trigger_source": request.trigger_source,
            "initiated_by_employee_code": request.initiated_by_employee_code,
            "lead_reviewer_employee_code": request.lead_reviewer_employee_code,
            "lead_agent_code": request.lead_agent_code,
            "status": request.status,
            "review_reason": request.review_reason
            or f"Khởi tạo đợt rà soát chủ động bởi AI {lead_persona['display_name']}.",
            "review_summary": request.review_summary,
            "assigned_departments": request.assigned_departments,
            "metadata": {
                **request.metadata,
                "workflow_type": "proactive_dossier_review",
                "lead_persona": lead_persona["display_name"],
                "lead_role_title": lead_persona["role_title"],
                "trigger_summary": trigger_summary.model_dump(exclude_none=True),
                **policy_summary_payload,
            },
            "actor_type": "agent",
            "actor_employee_code": request.lead_reviewer_employee_code
            or request.initiated_by_employee_code,
            "actor_agent_code": request.lead_agent_code,
            "action_summary": f"Khởi tạo đợt rà soát hồ sơ chủ động cho dự án {request.project_code}.",
            "baseline_snapshot": request.baseline_snapshot.model_dump(exclude_none=True)
            if request.baseline_snapshot
            else None,
        }
        core_result = self._execute_core_review_write_phase(
            request=request,
            review_payload=review_payload,
            review_code=review_code,
            policy_checks=policy_checks,
        )
        session = core_result["session"]
        employee_log_summaries = self._persist_employee_logs(
            request=request,
            review_id=session["review_id"],
            review_code=review_code,
            workflow_employee_actions=core_result["workflow_employee_actions"],
        )
        refreshed_session = self._postgres_client.fetch_dossier_review_sessions(
            review_id=session["review_id"]
        )
        if not refreshed_session:
            raise ValueError("Không thể tải lại phiên rà soát sau khi lưu workflow.")
        review_record = self._build_review_record(refreshed_session[0])
        _, operational_state_snapshot, operational_state_message = (
            self._build_operational_state_enrichment()
        )
        return self._build_run_summary(
            request=request,
            review_record=review_record,
            core_result=core_result,
            employee_log_summaries=employee_log_summaries,
            operational_state_snapshot=operational_state_snapshot,
            operational_state_message=operational_state_message,
            policy_checks=policy_checks,
            policy_summary=policy_summary,
            trigger_summary=trigger_summary,
            review_code=review_code,
        )
