"""
Reminder rules CRUD API.
"""

from datetime import datetime
from typing import Literal
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from pydantic import BaseModel, ConfigDict, Field

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: Literal["subscription_expiry", "invoice_overdue", "custom"] = "custom"
    trigger_days: int = Field(default=3, ge=0, le=365)
    send_email: bool = True
    send_telegram: bool = True
    email_template_id: int | None = None
    telegram_template: str | None = None
    status: Literal["active", "disabled"] = "active"


class ReminderCreate(ReminderBase):
    pass


class ReminderUpdate(BaseModel):
    reminder_type: Literal["subscription_expiry", "invoice_overdue", "custom"] | None = None
    trigger_days: int | None = Field(default=None, ge=0, le=365)
    send_email: bool | None = None
    send_telegram: bool | None = None
    email_template_id: int | None = None
    telegram_template: str | None = None
    status: Literal["active", "disabled"] | 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
