"""Output target base data model."""

from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Optional


@dataclass
class OutputTarget:
    """Base class for output targets."""

    id: str
    name: str
    target_type: str  # "led", "ha_light"
    created_at: datetime
    updated_at: datetime
    description: Optional[str] = None
    tags: List[str] = field(default_factory=list)

    def register_with_manager(self, manager) -> None:
        """Register this target with the processor manager. Subclasses override."""
        pass

    def sync_with_manager(
        self, manager, *, settings_changed: bool, source_changed: bool, device_changed: bool
    ) -> None:
        """Push changed fields to a running processor. Subclasses override."""
        pass

    def update_fields(
        self,
        *,
        name=None,
        device_id=None,
        description=None,
        tags: Optional[List[str]] = None,
        **_kwargs,
    ) -> None:
        """Apply mutable field updates. Base handles common fields; subclasses handle type-specific ones."""
        if name is not None:
            self.name = name
        if description is not None:
            self.description = description
        if tags is not None:
            self.tags = tags

    def to_dict(self) -> dict:
        """Convert to dictionary."""
        return {
            "id": self.id,
            "name": self.name,
            "target_type": self.target_type,
            "description": self.description,
            "tags": self.tags,
            "created_at": self.created_at.isoformat(),
            "updated_at": self.updated_at.isoformat(),
        }

    @classmethod
    def from_dict(cls, data: dict) -> "OutputTarget":
        """Create from dictionary, dispatching to the correct subclass."""
        target_type = data.get("target_type", "led")
        if target_type == "led":
            from wled_controller.storage.wled_output_target import WledOutputTarget

            return WledOutputTarget.from_dict(data)
        if target_type == "ha_light":
            from wled_controller.storage.ha_light_output_target import HALightOutputTarget

            return HALightOutputTarget.from_dict(data)
        raise ValueError(f"Unknown target type: {target_type}")
