from datetime import datetime
from typing import Annotated

from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel, ConfigDict
from sqlalchemy import select, func
from sqlalchemy.orm import Session

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

router = APIRouter(prefix="/api/email-logs", tags=["email-logs"])


class EmailLogResponse(BaseModel):
    id: int
    sent_at: datetime
    recipient: str | None
    subject: str | None
    status: str
    error_message: str | None

    class Config:
        from_attributes = True


class PaginatedLogs(BaseModel):
    items: list[EmailLogResponse]
    total: int
    page: int
    page_size: int


@router.get("", response_model=PaginatedLogs)
def list_email_logs(
    current_user: Annotated[dict, Depends(get_current_user)],
    page: int = Query(1, ge=1),
    page_size: int = Query(50, ge=1, le=200),
    status: str | None = Query(None),
    db: Session = Depends(get_db),
):
    offset = (page - 1) * page_size
    base_query = select(EmailLog)
    count_query = select(func.count(EmailLog.id))

    if status:
        base_query = base_query.where(EmailLog.status == status)
        count_query = count_query.where(EmailLog.status == status)

    total = db.scalar(count_query) or 0
    rows = db.scalars(
        base_query.order_by(EmailLog.sent_at.desc())
        .offset(offset)
        .limit(page_size)
    ).all()

    return PaginatedLogs(
        items=[EmailLogResponse.model_validate(r) for r in rows],
        total=total,
        page=page,
        page_size=page_size,
    )
