"""
Reminder rules CRUD API.
"""

from datetime import datetime, date
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from pydantic import BaseModel, ConfigDict

from app.core.database import get_db
from app.core.models import Reminder
from app.core.security import get_current_user

router = APIRouter(prefix="/api/reminders", tags=["reminders"])


# ─── Pydantic Models ───────────────────────────────────────────────────────────

class ReminderBase(BaseModel):
    reminder_type: str = "custom"
    trigger_days: int = 3
    send_email: bool = True
    send_telegram: bool = True
    email_template_id: int | None = None
    telegram_template: str | None = None
    status: str = "active"


class ReminderCreate(ReminderBase):
    pass


class ReminderUpdate(BaseModel):
    reminder_type: str | None = None
    trigger_days: int | None = None
    send_email: bool | None = None
    send_telegram: bool | None = None
    email_template_id: int | None = None
    telegram_template: str | None = None
    status: str | None = None


class ReminderResponse(ReminderBase):
    id: int
    created_at: datetime

    model_config = ConfigDict(from_attributes=True)


class PaginatedReminders(BaseModel):
    items: list[ReminderResponse]
    total: int
    page: int
    page_size: int


# ─── Endpoints ─────────────────────────────────────────────────────────────────

@router.get("", response_model=PaginatedReminders)
def list_reminders(
    page: int = Query(1, ge=1),
    page_size: int = Query(20, ge=1, le=100),
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    total = db.query(Reminder).count()
    offset = (page - 1) * page_size
    items = db.query(Reminder).order_by(Reminder.id.desc()).offset(offset).limit(page_size).all()
    return PaginatedReminders(items=items, total=total, page=page, page_size=page_size)


@router.post("", response_model=ReminderResponse, status_code=201)
def create_reminder(
    data: ReminderCreate,
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    reminder = Reminder(**data.model_dump())
    db.add(reminder)
    db.commit()
    db.refresh(reminder)
    return reminder


@router.get("/{reminder_id}", response_model=ReminderResponse)
def get_reminder(
    reminder_id: int,
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    reminder = db.query(Reminder).get(reminder_id)
    if not reminder:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="Reminder not found")
    return reminder


@router.put("/{reminder_id}", response_model=ReminderResponse)
def update_reminder(
    reminder_id: int,
    data: ReminderUpdate,
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    reminder = db.query(Reminder).get(reminder_id)
    if not reminder:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="Reminder not found")
    for key, value in data.model_dump(exclude_unset=True).items():
        setattr(reminder, key, value)
    db.commit()
    db.refresh(reminder)
    return reminder


@router.delete("/{reminder_id}", status_code=204)
def delete_reminder(
    reminder_id: int,
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    reminder = db.query(Reminder).get(reminder_id)
    if not reminder:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="Reminder not found")
    db.delete(reminder)
    db.commit()


@router.post("/check-now")
async def trigger_reminder_check(
    current_user: dict = Depends(get_current_user),
):
    from app.services.reminder_service import check_and_send_reminders
    results = await check_and_send_reminders()
    return results
