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

@dataclass
class ParameterHistoryPoint:

    timestamp: datetime
    value: float

    status: SignalStatus
    trend: TrendRuleHits

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

    @classmethod
    def from_dict(cls, data: dict) -> "ParameterHistoryPoint":
        return cls(
            timestamp=datetime.fromisoformat(data["timestamp"]),
            value=data["value"],
            status=SignalStatus(data["status"]),
            trend=data["trend"],
        )


@dataclass
class ParameterHistory:

    parameter: ParameterRef
    samples: List[ParameterHistoryPoint]


    def to_dict(self) -> dict:
        return {
            "parameter": self.parameter.to_dict(),
            "samples": [
                sample.to_dict()
                for sample in self.samples
            ],
        }

    @classmethod
    def from_dict(cls, data: dict) -> "ParameterHistory":
        return cls(
            parameter=ParameterRef.from_dict(
                data["parameter"]
            ),
            samples=[
                ParameterHistoryPoint.from_dict(s)
                for s in data.get("samples", [])
            ],
        )