"""Subject lines manager: CRUD, search, CSV/TXT import, export, clear-all."""
import csv
import io

from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from sqlalchemy import delete as sa_delete, func, select
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.deps import get_current_user, get_db
from app.core.config import settings
from app.models import SubjectLine, User

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


class SubjectIn(BaseModel):
    subject: str


@router.get("/list")
async def list_subjects(q: str = "", page: int = 1, limit: int = 100,
                        user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
    stmt = select(SubjectLine).where(SubjectLine.user_id == user.id)
    if q:
        stmt = stmt.where(SubjectLine.subject.ilike(f"%{q}%"))
    total = (await db.execute(select(func.count()).select_from(stmt.subquery()))).scalar()
    rows = (await db.execute(stmt.order_by(SubjectLine.id).offset((page - 1) * limit).limit(limit))).scalars().all()
    return {"total": total, "subjects": [{"id": s.id, "subject": s.subject,
                                          "use_count": s.use_count} for s in rows]}


@router.post("")
async def add_subject(payload: SubjectIn, user: User = Depends(get_current_user),
                      db: AsyncSession = Depends(get_db)):
    count = (await db.execute(select(func.count(SubjectLine.id)).where(
        SubjectLine.user_id == user.id))).scalar()
    if count >= settings.MAX_SUBJECTS:
        raise HTTPException(400, f"Maximum of {settings.MAX_SUBJECTS} subject variations reached")
    row = SubjectLine(user_id=user.id, subject=payload.subject.strip()[:500])
    db.add(row)
    await db.commit()
    return {"id": row.id, "subject": row.subject}


@router.post("/bulk")
async def add_bulk(payload: dict, user: User = Depends(get_current_user),
                   db: AsyncSession = Depends(get_db)):
    subjects = [s.strip() for s in (payload.get("subjects") or []) if s.strip()]
    if not subjects:
        raise HTTPException(400, "No subjects provided")
    count = (await db.execute(select(func.count(SubjectLine.id)).where(
        SubjectLine.user_id == user.id))).scalar()
    if count + len(subjects) > settings.MAX_SUBJECTS:
        raise HTTPException(400, f"Would exceed maximum of {settings.MAX_SUBJECTS} subjects")
    for s in subjects:
        db.add(SubjectLine(user_id=user.id, subject=s[:500]))
    await db.commit()
    return {"ok": True, "added": len(subjects)}
---AUTH---
93:async def me(user=Depends(get_current_user)):
---DEPS---
app/api/deps.py
app/api/deps.py:60:def require_csrf(request: Request, x_csrf_token: Optional[str] = Header(None)) -> None:
app/api/deps.py:70:    if not cookie or not x_csrf_token or cookie != x_csrf_token:
app/core/config.py:27:    CSRF_COOKIE_NAME: str = "mailer_csrf"
app/core/security.py:33:                  "access_token", "secret", "token", "csrf", "new_password", "old_password"}
