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


@dataclass
class DayConfig:
    day: int      # 0=Sun, 1=Mon, ..., 6=Sat
    hour: int     # 0–23 (24h)
    minute: int   # 0, 15, 30, or 45

    def to_dict(self) -> dict:
        return {
            'day': self.day,
            'hour': self.hour,
            'minute': self.minute,
        }

    @classmethod
    def from_dict(cls, d: dict) -> 'DayConfig':
        return cls(
            day=d.get('day', 0),
            hour=d.get('hour', 0),
            minute=d.get('minute', 0),
        )


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

    # mode='days' fields
    day_configs: list = field(default_factory=list)   # list of DayConfig dicts
    default_hour: int = 8    # master deadline hour for 'days' mode
    default_minute: int = 0  # master deadline minute for 'days' mode
    default_has_deadline: bool = True  # False = 'Anytime', no expiry for 'days' mode

    # mode='interval' fields
    interval_days: int = 2              # 1–7
    anchor_date: str = ""               # ISO date string e.g. "2026-02-25"; "" = use today
    interval_has_deadline: bool = True  # False = "Anytime" (no deadline)
    interval_hour: int = 0
    interval_minute: int = 0

    enabled: bool = True  # False = schedule paused; chore won't appear for child

    @classmethod
    def from_dict(cls, d: dict) -> 'ChoreSchedule':
        return cls(
            child_id=d.get('child_id'),
            task_id=d.get('task_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,
            'task_id': self.task_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
