"""Data models for the Debug Oracle."""
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Optional


class Severity(str, Enum):
    INFO = "info"
    WARNING = "warning"
    ERROR = "error"
    CRITICAL = "critical"


class SourceType(str, Enum):
    DOCKER = "docker"
    SYSTEMD = "systemd"
    GIT = "git"
    METRICS = "metrics"
    CONFIG = "config"
    FILESYSTEM = "filesystem"


@dataclass
class LogEntry:
    """A single log entry from any source."""
    timestamp: datetime
    source: SourceType
    source_name: str  # Container name, unit name, etc.
    severity: Severity
    message: str
    raw: str = ""  # Full raw line


@dataclass
class MetricSnapshot:
    """System metrics at a point in time."""
    timestamp: datetime
    cpu_percent: float = 0.0
    memory_percent: float = 0.0
    disk_percent: float = 0.0
    load_avg: tuple = ()  # (1m, 5m, 15m)
    network_bytes_in: int = 0
    network_bytes_out: int = 0
    # Per-process if available
    top_processes: list[dict] = field(default_factory=list)


@dataclass
class GitChange:
    """Recent git change."""
    timestamp: datetime
    repo_path: str
    commit_hash: str
    message: str
    author: str
    files_changed: list[str] = field(default_factory=list)


@dataclass
class EvidenceItem:
    """A piece of evidence collected during investigation."""
    source_type: SourceType
    source_name: str
    timestamp: Optional[datetime]
    content: str
    relevance: str = ""  # Why this matters (filled by reasoning)


@dataclass
class CausalChain:
    """A causal chain explaining a failure."""
    # The observable symptom
    symptom: str
    # The likely root cause
    root_cause: str
    # The chain of events: A caused B caused C
    chain: list[str] = field(default_factory=list)
    # Confidence in this analysis (0-1)
    confidence: float = 0.0
    # Supporting evidence
    evidence: list[str] = field(default_factory=list)
    # Recommended action
    recommendation: str = ""


@dataclass
class Investigation:
    """Complete investigation result."""
    query: str
    timestamp: datetime = field(default_factory=datetime.now)
    # Collected data
    logs: list[LogEntry] = field(default_factory=list)
    metrics: list[MetricSnapshot] = field(default_factory=list)
    git_changes: list[GitChange] = field(default_factory=list)
    evidence: list[EvidenceItem] = field(default_factory=list)
    # Analysis
    causal_chains: list[CausalChain] = field(default_factory=list)
    # Summary
    summary: str = ""
    # Raw LLM response (for debugging)
    raw_response: str = ""
