from dataclasses import dataclass, field
from typing import Literal
from models.base import BaseModel


@dataclass
class RoutineSchedule(BaseModel):
    child_id: str
    routine_id: str
    mode: Literal['days', 'interval']

    day_configs: list = field(default_factory=list)
    default_hour: int = 8
    default_minute: int = 0
    default_has_deadline: bool = True

    interval_days: int = 2
    anchor_date: str = ""
    interval_has_deadline: bool = True
    interval_hour: int = 0
    interval_minute: int = 0

    enabled: bool = True

    @classmethod
    def from_dict(cls, d: dict) -> 'RoutineSchedule':
        return cls(
            child_id=d.get('child_id'),
            routine_id=d.get('routine_id'),
            mode=d.get('mode', 'days'),
            day_configs=d.get('day_configs', []),
            default_hour=d.get('default_hour', 8),
            default_minute=d.get('default_minute', 0),
            default_has_deadline=d.get('default_has_deadline', True),
            interval_days=d.get('interval_days', 2),
            anchor_date=d.get('anchor_date', ''),
            interval_has_deadline=d.get('interval_has_deadline', True),
            interval_hour=d.get('interval_hour', 0),
            interval_minute=d.get('interval_minute', 0),
            enabled=d.get('enabled', True),
            id=d.get('id'),
            created_at=d.get('created_at'),
            updated_at=d.get('updated_at'),
        )

    def to_dict(self) -> dict:
        base = super().to_dict()
        base.update({
            'child_id': self.child_id,
            'routine_id': self.routine_id,
            'mode': self.mode,
            'day_configs': self.day_configs,
            'default_hour': self.default_hour,
            'default_minute': self.default_minute,
            'default_has_deadline': self.default_has_deadline,
            'interval_days': self.interval_days,
            'anchor_date': self.anchor_date,
            'interval_has_deadline': self.interval_has_deadline,
            'interval_hour': self.interval_hour,
            'interval_minute': self.interval_minute,
            'enabled': self.enabled,
        })
        return base
