"""
Base Classes für Alert Actions.

Definiert das Interface für alle Action-Handler.
"""
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, Any, Optional, List
from enum import Enum


class ActionType(str, Enum):
    """Verfügbare Aktionstypen."""
    EMAIL = "email"
    WEBHOOK = "webhook"
    SLACK = "slack"
    TEAMS = "teams"
    TAG = "tag"
    ARCHIVE = "archive"


@dataclass
class ActionResult:
    """Ergebnis einer ausgeführten Aktion."""
    success: bool
    action_type: ActionType
    message: str
    timestamp: datetime = field(default_factory=datetime.utcnow)
    details: Dict[str, Any] = field(default_factory=dict)
    error: Optional[str] = None

    def to_dict(self) -> Dict[str, Any]:
        """Konvertiert zu Dict für Logging/Speicherung."""
        return {
            "success": self.success,
            "action_type": self.action_type.value,
            "message": self.message,
            "timestamp": self.timestamp.isoformat(),
            "details": self.details,
            "error": self.error,
        }


@dataclass
class AlertContext:
    """Kontext für eine Aktion mit Alert-Informationen."""
    alert_id: str
    title: str
    url: str
    snippet: str
    topic_name: str
    relevance_score: Optional[float] = None
    relevance_decision: Optional[str] = None
    matched_rule: Optional[str] = None
    tags: List[str] = field(default_factory=list)

    def to_dict(self) -> Dict[str, Any]:
        """Konvertiert zu Dict für Templates."""
        return {
            "alert_id": self.alert_id,
            "title": self.title,
            "url": self.url,
            "snippet": self.snippet,
            "topic_name": self.topic_name,
            "relevance_score": self.relevance_score,
            "relevance_decision": self.relevance_decision,
            "matched_rule": self.matched_rule,
            "tags": self.tags,
        }


class ActionHandler(ABC):
    """
    Abstrakte Basisklasse für Action-Handler.

    Jede Aktion (Email, Webhook, Slack) implementiert diese Schnittstelle.
    """

    @property
    @abstractmethod
    def action_type(self) -> ActionType:
        """Gibt den Aktionstyp zurück."""
        pass

    @abstractmethod
    async def execute(
        self,
        context: AlertContext,
        config: Dict[str, Any],
    ) -> ActionResult:
        """
        Führt die Aktion aus.

        Args:
            context: Alert-Kontext mit allen relevanten Informationen
            config: Aktionsspezifische Konfiguration

        Returns:
            ActionResult mit Erfolgsstatus und Details
        """
        pass

    def validate_config(self, config: Dict[str, Any]) -> bool:
        """
        Validiert die Aktions-Konfiguration.

        Args:
            config: Zu validierende Konfiguration

        Returns:
            True wenn gültig
        """
        return True

    def get_required_config_fields(self) -> List[str]:
        """
        Gibt erforderliche Konfigurationsfelder zurück.

        Returns:
            Liste von Feldnamen
        """
        return []
