from __future__ import annotations

from typing import Any

from app.models.schemas import (
    CompanyOperationalBacklogItem,
    CompanyOperationalBlockedItem,
    CompanyOperationalProjectState,
    CompanyOperationalRiskItem,
    CompanyOperationalSourceStatus,
    CompanyOperationalStateSummaryItem,
    CompanyOperationalSummary,
    CompanyOperationalWorkforceStatus,
)

from .helpers import (
    is_active_project,
    is_high_severity,
    is_open_status,
    merge_messages,
)


def build_summary(
    *,
    projects: list[CompanyOperationalProjectState],
    risks: list[CompanyOperationalRiskItem],
    blocked_items: list[CompanyOperationalBlockedItem],
    backlog: list[CompanyOperationalBacklogItem],
    workforce: CompanyOperationalWorkforceStatus,
    operations_cases: list[Any],
    operations_actions: list[Any],
    dossier_reviews: list[dict[str, Any]],
) -> CompanyOperationalSummary:
    """Tạo summary chính."""
    return CompanyOperationalSummary(
        total_projects=len(projects),
        active_projects=sum(1 for item in projects if is_active_project(item.status)),
        blocked_projects=len(
            {item.project_code for item in blocked_items if item.project_code}
        ),
        high_risk_projects=len(
            {
                item.project_code
                for item in risks
                if item.project_code
                and is_high_severity(item.severity)
                and is_open_status(item.status)
            }
        ),
        open_risks=sum(1 for item in risks if is_open_status(item.status)),
        blocked_items_count=len(blocked_items),
        backlog_items_count=len(backlog),
        open_cases_count=sum(
            1 for item in operations_cases if is_open_status(item.current_status)
        ),
        open_actions_count=sum(
            1 for item in operations_actions if is_open_status(item.status)
        ),
        active_review_sessions=sum(
            1
            for item in dossier_reviews
            if str(item.get("status") or "").strip().lower()
            not in {"closed", "cancelled"}
        ),
        employees_active=workforce.total_employees_active,
        employees_blocked=workforce.employees_blocked,
        employees_in_progress=workforce.employees_in_progress,
        employees_completed=workforce.employees_completed,
    )


def build_source_status(
    source_name: str,
    source: str | None,
    record_count: int,
    used_fallback: bool,
    message: str | None,
) -> CompanyOperationalSourceStatus:
    """Tạo health cho 1 nguồn."""
    normalized_source = str(source or "").strip().lower()
    available = normalized_source not in {
        "",
        "fallback",
        "postgres_disabled",
        "unavailable",
        "error",
    }
    return CompanyOperationalSourceStatus(
        source_name=source_name,
        source=source,
        available=available,
        used_fallback=used_fallback,
        record_count=record_count,
        message=message,
    )


def build_source_status_list(**kwargs: Any) -> list[CompanyOperationalSourceStatus]:
    """Tạo danh sách health của nguồn."""
    project_response = kwargs["project_response"]
    employee_response = kwargs["employee_response"]
    dossier_response = kwargs["dossier_response"]
    operations_cases_response = kwargs["operations_cases_response"]
    operations_actions_response = kwargs["operations_actions_response"]
    operations_blockers_response = kwargs["operations_blockers_response"]
    remediation_response = kwargs["remediation_response"]
    return [
        build_source_status(
            "projects",
            project_response.source,
            len(project_response.items),
            project_response.used_fallback,
            project_response.message,
        ),
        build_source_status(
            "employee_logs",
            employee_response.source,
            len(employee_response.items),
            employee_response.used_fallback,
            employee_response.message,
        ),
        build_source_status(
            "dossier_reviews",
            kwargs["dossier_source"],
            len(dossier_response),
            kwargs["dossier_used_fallback"],
            kwargs["dossier_message"],
        ),
        build_source_status(
            "operations_cases",
            operations_cases_response.source,
            len(operations_cases_response.items),
            operations_cases_response.used_fallback,
            operations_cases_response.message,
        ),
        build_source_status(
            "operations_actions",
            operations_actions_response.source,
            len(operations_actions_response.items),
            operations_actions_response.used_fallback,
            operations_actions_response.message,
        ),
        build_source_status(
            "operations_blockers",
            operations_blockers_response.source,
            len(operations_blockers_response.items),
            operations_blockers_response.used_fallback,
            operations_blockers_response.message,
        ),
        build_source_status(
            "remediation_plans",
            remediation_response.source,
            len(remediation_response.items),
            remediation_response.used_fallback,
            remediation_response.message,
        ),
    ]


def build_response_message(*messages: str | None) -> str | None:
    """Gộp message phản hồi."""
    return merge_messages(*messages)


def build_state_summaries(
    *,
    summary: CompanyOperationalSummary,
    operations_cases_count: int,
    operations_actions_count: int,
    operations_blockers_count: int,
    remediation_plans_count: int,
) -> list[CompanyOperationalStateSummaryItem]:
    """Tạo summary cards."""
    return [
        CompanyOperationalStateSummaryItem(
            code="projects_overview",
            label="Tổng quan dự án",
            value=str(summary.total_projects),
            unit="projects",
            trend="neutral",
            severity="info",
            metadata={
                "active_projects": summary.active_projects,
                "blocked_projects": summary.blocked_projects,
                "high_risk_projects": summary.high_risk_projects,
            },
        ),
        CompanyOperationalStateSummaryItem(
            code="open_risks",
            label="Rủi ro đang mở",
            value=str(summary.open_risks),
            unit="risks",
            trend="up" if summary.open_risks else "neutral",
            severity="high" if summary.high_risk_projects else "info",
            metadata={
                "high_risk_projects": summary.high_risk_projects,
                "blocked_items_count": summary.blocked_items_count,
            },
        ),
        CompanyOperationalStateSummaryItem(
            code="operations_follow_up",
            label="Tác vụ vận hành mở",
            value=str(summary.open_actions_count),
            unit="actions",
            trend="up" if summary.open_actions_count else "neutral",
            severity="medium" if summary.open_actions_count else "info",
            metadata={
                "open_cases_count": summary.open_cases_count,
                "operations_cases_count": operations_cases_count,
                "operations_actions_count": operations_actions_count,
                "operations_blockers_count": operations_blockers_count,
            },
        ),
        CompanyOperationalStateSummaryItem(
            code="remediation_pipeline",
            label="Kế hoạch khắc phục hồ sơ",
            value=str(remediation_plans_count),
            unit="plans",
            trend="up" if remediation_plans_count else "neutral",
            severity="medium" if remediation_plans_count else "info",
            metadata={
                "active_review_sessions": summary.active_review_sessions,
                "backlog_items_count": summary.backlog_items_count,
            },
        ),
    ]
