from __future__ import annotations

from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import List, Optional
from Copilot.numericLayer.Core.SignalInsight import SignalStatus
from Copilot.numericLayer.Core.ruleHits import TrendRuleHits
from Copilot.dataAcquisition.Core.CollectedData import  ParameterRef



@dataclass
class MachineParameterSnapshot:
    parameter: ParameterRef
    value: Optional[float]
    timestamp: Optional[datetime]
    trend: TrendRuleHits
    status: Optional[SignalStatus]

    def to_dict(self) -> dict:
        return {
            "parameter": self.parameter.to_dict(),
            "value": self.value,
            "timestamp": (
                self.timestamp.isoformat()
                if self.timestamp else None
            ),
            "trend": self.trend,
            "status": (
                self.status.value
                if self.status else None
            ),
        }

    @classmethod
    def from_dict(cls, data: dict) -> "MachineParameterSnapshot":
        return cls(
            parameter=ParameterRef.from_dict(
                data["parameter"]
            ),
            value=data.get("value"),
            timestamp=(
                datetime.fromisoformat(data["timestamp"])
                if data.get("timestamp") else None
            ),
            trend=data["trend"],
            status=(
                SignalStatus(data["status"])
                if data.get("status") else None
            ),
        )