from datetime import date

from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.db.session import get_db
from app.schemas.user_context import CurrentUser
from app.services.reminder_service import ReminderService

router = APIRouter()


class UpdateReminderStatusRequest(BaseModel):
    status: str
    notes: str | None = None


@router.get("")
def list_reminders(
    reminder_date: date | None = Query(default=None),
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return ReminderService(db).list_reminders(current_user.agency_id, reminder_date)


@router.post("/run")
def run_reminders_now(
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    if current_user.role != "admin":
        from app.core.exceptions import ForbiddenError

        raise ForbiddenError("Only admins can trigger reminder generation")
    service = ReminderService(db)
    generated = service.generate_daily_reminders()
    whatsapp = service.send_whatsapp_for_today()
    return {"generated": generated, "whatsapp": whatsapp}


@router.patch("/{reminder_id}")
def update_reminder_status(
    reminder_id: int,
    payload: UpdateReminderStatusRequest,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return ReminderService(db).mark_reminder_status(
        current_user.agency_id,
        reminder_id,
        payload.status,
        payload.notes,
    )
