"""Persistent Emergency Kill Switch."""
from __future__ import annotations

import json
from datetime import datetime, timezone
from typing import Any, Optional

from backend.app.alerts.engine import AlertLevel, alert_engine
from backend.app.audit.logger import audit_logger
from backend.app.database.session import db_manager


class KillSwitch:
    """Manages system-wide emergency trading halt with persistent state across reboots."""

    STATE_KEY = "KILL_SWITCH_ACTIVE"
    METADATA_KEY = "KILL_SWITCH_METADATA"

    def is_active(self) -> bool:
        """Check if trading is currently halted."""
        val = db_manager.get_system_state(self.STATE_KEY)
        return val == "true"

    def get_details(self) -> dict[str, Any]:
        """Fetch metadata including timestamp, reason, and initiator."""
        active = self.is_active()
        meta_json = db_manager.get_system_state(self.METADATA_KEY)
        meta = json.loads(meta_json) if meta_json else {}
        return {
            "active": active,
            "reason": meta.get("reason", "No active kill switch"),
            "triggered_at": meta.get("triggered_at", None),
            "triggered_by": meta.get("triggered_by", None),
        }

    def trigger(self, reason: str, triggered_by: str = "SYSTEM_RISK_ENGINE") -> None:
        """Trip the emergency kill switch and persist state to disk/database."""
        now = datetime.now(timezone.utc).isoformat()
        metadata = {
            "reason": reason,
            "triggered_at": now,
            "triggered_by": triggered_by,
        }
        db_manager.set_system_state(self.STATE_KEY, "true")
        db_manager.set_system_state(self.METADATA_KEY, json.dumps(metadata))

        alert_engine.emit(
            level=AlertLevel.CRITICAL,
            title="EMERGENCY KILL SWITCH TRIPPED",
            message=f"Trading suspended immediately. Reason: {reason}",
            context=metadata,
        )
        audit_logger.critical("KILL SWITCH ENGAGED: %s by %s at %s", reason, triggered_by, now)

    def reset(self, reset_by: str = "ADMIN") -> bool:
        """Disengage kill switch with authorized admin confirmation."""
        now = datetime.now(timezone.utc).isoformat()
        metadata = {
            "reset_at": now,
            "reset_by": reset_by,
        }
        db_manager.set_system_state(self.STATE_KEY, "false")
        db_manager.set_system_state(self.METADATA_KEY, json.dumps(metadata))

        alert_engine.emit(
            level=AlertLevel.INFO,
            title="KILL SWITCH RESET",
            message="Trading system restored by authorized administrator.",
            context=metadata,
        )
        audit_logger.info("KILL SWITCH DISENGAGED by %s at %s", reset_by, now)
        return True


kill_switch = KillSwitch()
