from __future__ import annotations

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from jarvis_gateway import __version__
from jarvis_gateway.config import load_runtime_config
from jarvis_gateway.contracts import ActivityEvent, ApprovalItem, DemoInfo, ModuleRegistryEntry, OverviewResponse, RedactionPolicy, ReportLink, utcnow
from jarvis_gateway.registry import get_module_registry
from jarvis_gateway.legacy_links import validate_legacy_link
from jarvis_gateway.services.overview_service import OverviewService
from jarvis_gateway.services.finance_trader_desk import load_trader_desk_bridge, load_trader_desk_preflight, load_trader_desk_scorecard


def create_app() -> FastAPI:
    config = load_runtime_config()
    application = FastAPI(
        title="JARVIS API Gateway",
        version=__version__,
        description="Mock-only API Gateway skeleton for JARVIS Command Dashboard.",
    )
    if config.jarvis_env == "development":
        application.add_middleware(
            CORSMiddleware,
            allow_origins=config.jarvis_dev_cors_origins,
            allow_credentials=False,
            allow_methods=["GET", "OPTIONS"],
            allow_headers=["*"],
        )

    @application.get("/api/healthz")
    def healthz() -> dict[str, object]:
        current = load_runtime_config()
        return {
            "status": "ok",
            "service": "jarvis-api-gateway",
            "version": __version__,
            "demo_mode": current.jarvis_demo_mode,
            "domain_access": "link_only",
            "environment": current.jarvis_env,
            "contract_version": "jarvis.overview.v1",
            "generated_at": utcnow().isoformat(),
        }

    @application.get("/api/modules", response_model=list[ModuleRegistryEntry])
    def modules() -> list[ModuleRegistryEntry]:
        return get_module_registry()

    @application.get("/api/overview", response_model=OverviewResponse)
    def overview() -> OverviewResponse:
        return OverviewService.from_config().build_overview()

    @application.get("/api/demo-info", response_model=DemoInfo)
    def demo_info() -> DemoInfo:
        current = load_runtime_config()
        mixed_modes = {
            current.finance_adapter_mode,
            current.health_adapter_mode,
            current.autoshorts_adapter_mode,
        }
        is_mock_only = mixed_modes == {"mock"}
        health_link_result = validate_legacy_link(current.health_legacy_dashboard_url, allow_tailnet_links=current.jarvis_allow_tailnet_links)
        legacy_links = {
            "finance": validate_legacy_link(current.finance_legacy_dashboard_url, allow_tailnet_links=current.jarvis_allow_tailnet_links).status.value,
            "health": "locked_by_policy" if not current.health_legacy_dashboard_url else ("configured_protected" if health_link_result.status.value == "configured" else health_link_result.status.value),
            "family": validate_legacy_link(current.family_legacy_dashboard_url, allow_tailnet_links=current.jarvis_allow_tailnet_links).status.value,
            "autoshorts": validate_legacy_link(current.autoshorts_legacy_dashboard_url, allow_tailnet_links=current.jarvis_allow_tailnet_links).status.value,
        }
        mode = current.jarvis_operator_demo_profile if current.jarvis_operator_demo_profile != "demo_mock" else ("demo_mock" if is_mock_only else "demo_mixed_readonly")
        return DemoInfo(
            mode=mode,
            actions_enabled=False,
            modules=["finance", "health", "autoshorts", "family", "system"],
            runtime_access="optional_readonly" if mode == "mixed_readonly_handoff" else "disabled" if is_mock_only else "optional_readonly",
            legacy_links=legacy_links,
        )

    @application.get("/api/activity", response_model=list[ActivityEvent])
    def activity() -> list[ActivityEvent]:
        return OverviewService.from_config().build_overview().activity

    @application.get("/api/approvals", response_model=list[ApprovalItem])
    def approvals() -> list[ApprovalItem]:
        return OverviewService.from_config().build_overview().approvals

    @application.get("/api/reports", response_model=list[ReportLink])
    def reports() -> list[ReportLink]:
        return OverviewService.from_config().build_overview().reports

    @application.get("/api/finance/trader-desk")
    def finance_trader_desk() -> dict[str, object]:
        return load_trader_desk_bridge()

    @application.get("/api/finance/trader-desk/scorecard")
    def finance_trader_desk_scorecard() -> dict[str, object]:
        return load_trader_desk_scorecard()

    @application.get("/api/finance/trader-desk/preflight")
    def finance_trader_desk_preflight() -> dict[str, object]:
        return load_trader_desk_preflight()

    @application.get("/api/redaction-policy", response_model=RedactionPolicy)
    def redaction_policy() -> RedactionPolicy:
        current = load_runtime_config()
        return RedactionPolicy(
            default_display_policy="summary",
            allow_exact_finance_values=False,
            allow_health_detail_links=False,
            forbidden_fields=["see docs/security/forbidden-fields.md"],
            log_forbidden_fields=["see docs/security/forbidden-fields.md"],
            demo_mode=current.jarvis_demo_mode,
        )

    return application


app = create_app()
