from datetime import datetime
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

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

    model_config = ConfigDict(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(
    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,
    )