from datetime import datetime, date
from typing import Optional, Any
from pydantic import BaseModel


class RecurringTaskCreate(BaseModel):
    title:             str
    assigned_to:       Optional[int]  = None
    recurrence_type:   str            # monthly_date | every_n_weeks | monthly_weekday
    recurrence_config: dict[str, Any]
    trigger_mode:      str            = "on_schedule"  # on_completion | on_schedule | both
    advance_days:      int            = 0


class RecurringTaskUpdate(BaseModel):
    title:             Optional[str]            = None
    assigned_to:       Optional[int]            = None
    recurrence_type:   Optional[str]            = None
    recurrence_config: Optional[dict[str, Any]] = None
    trigger_mode:      Optional[str]            = None
    advance_days:      Optional[int]            = None
    is_active:         Optional[bool]           = None


class RecurringTaskOut(BaseModel):
    id:                int
    title:             str
    assigned_to:       Optional[int]
    assigned_username: Optional[str]
    created_by:        int
    created_by_username: str
    recurrence_type:   str
    recurrence_config: dict[str, Any]
    trigger_mode:      str
    advance_days:      int
    is_active:         bool
    last_generated_due: Optional[date]
    next_due_date:     Optional[date]
    created_at:        datetime

    model_config = {"from_attributes": True}
