from __future__ import annotations

from abc import ABC, abstractmethod

from jarvis_gateway.contracts import (
    ActionDescriptor,
    ActionMode,
    DisplayPolicy,
    KpiItem,
    ModuleId,
    ModuleSnapshot,
    ModuleStatus,
    Sensitivity,
    Severity,
    SourceHealth,
    SourceType,
    utcnow,
)
from jarvis_gateway.redaction import redact_error_message


class BaseAdapter(ABC):
    module_id: ModuleId | str
    title: str

    @abstractmethod
    def get_snapshot(self) -> ModuleSnapshot:
        raise NotImplementedError

    def error_snapshot(self, exc: Exception) -> ModuleSnapshot:
        now = utcnow()
        module_id = ModuleId(self.module_id)
        sensitivity = Sensitivity.SENSITIVE if module_id == ModuleId.FINANCE else Sensitivity.CRITICAL if module_id == ModuleId.HEALTH else Sensitivity.INTERNAL
        return ModuleSnapshot(
            module_id=module_id,
            title=self.title,
            status=ModuleStatus.DEGRADED,
            sensitivity=sensitivity,
            display_policy=DisplayPolicy.SUMMARY,
            last_success_at=None,
            last_attempt_at=now,
            stale_after_seconds=300,
            degraded_reason="adapter_error",
            source_health=SourceHealth(
                reachable=False,
                latency_ms=None,
                source_type=SourceType.MOCK,
                version="mock-v1",
                contract_version="jarvis.module_snapshot.v1",
                last_success_at=None,
                last_error_redacted=redact_error_message(str(exc)),
                stale=True,
            ),
            kpis=[
                KpiItem(
                    key="source_status",
                    label="Source",
                    value="degraded",
                    unit=None,
                    severity=Severity.ERROR,
                    sensitivity=Sensitivity.INTERNAL,
                    display_policy=DisplayPolicy.SUMMARY,
                    help_text="Adapter error converted to safe degraded snapshot.",
                )
            ],
            attention_items=[],
            links=[],
            primary_action=ActionDescriptor(
                label="Open module",
                href=f"/{module_id.value}",
                mode=ActionMode.LINK_ONLY,
                sensitivity=sensitivity,
                blocked_reason=None,
                preview_required=False,
                confirm_required=False,
                audit_required=False,
            ),
            contract_version="jarvis.module_snapshot.v1",
        )
