from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.database import get_db
from src.core.auth import require_enterprise_or_front
from src.core.api_responses import (
    build_success_payload,
    SuccessResponse,
    ErrorResponse,
    to_schema_dict,
)
from src.services.palavras import PalavrasService
from src.schemas.palavras import PalavraCreate, PalavraResponse
from src.crud.palavras import crud as palavras_crud

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


@router.post(
    "/criar",
    summary="Criar palavra-chave",
    status_code=status.HTTP_201_CREATED,
    response_model=SuccessResponse,
    responses={
        201: {"description": "Palavra criada com sucesso"},
        400: {
            "description": "Violação de constraint ou dados inválidos",
            "model": ErrorResponse,
        },
        401: {
            "description": "Credenciais inválidas ou ausentes",
            "model": ErrorResponse,
        },
        500: {"description": "Erro interno", "model": ErrorResponse},
    },
)
async def criar_palavra(
    payload: PalavraCreate,
    db: AsyncSession = Depends(get_db),
    _auth=Depends(require_enterprise_or_front),
):
    try:
        obj = await PalavrasService.criar(db, payload)
    except Exception as e:
        raise HTTPException(
            status_code=400,
            detail=f"Erro ao criar palavra: {str(e)}"
        )
    data = to_schema_dict(PalavraResponse, obj)
    message = f"Palavra criada com sucesso (ID: {data.get('id')})"
    return build_success_payload(data=data, message=message)


@router.get(
    "/buscar",
    summary="Listar palavras-chave",
    response_model=SuccessResponse,
    responses={
        200: {"description": "Lista de palavras"},
        500: {"description": "Erro interno"},
    },
)
async def listar_palavras(
    palavra: Optional[str] = Query(
        None,
        description="Filtro por palavra (contém)",
    ),
    db: AsyncSession = Depends(get_db),
    _auth=Depends(require_enterprise_or_front),
):
    items = await PalavrasService.listar(db, palavra=palavra)
    data = [to_schema_dict(PalavraResponse, x) for x in items]
    qtd = len(data)
    if qtd == 0:
        message = "Nenhuma palavra encontrada"
    elif qtd == 1:
        message = "1 palavra encontrada"
    else:
        message = f"{qtd} palavras encontradas"
    return build_success_payload(data=data, message=message)


@router.delete(
    "/{palavra_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Excluir palavra",
    responses={
        204: {"description": "Palavra excluída"},
        404: {"description": "Palavra não encontrada"},
    },
)
async def deletar_palavra(palavra_id: int, db: AsyncSession = Depends(get_db)):
    ok = await palavras_crud.delete(db, palavra_id)
    if not ok:
        raise HTTPException(
            status_code=404,
            detail=f"Palavra '{palavra_id}' não encontrada"
        )
    return None
