from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.orm import Session
from app import crud, models, schemas, security
from app.database import get_db


SECTIONS:list[schemas.Section] = [
    schemas.Section(id="nacionales", label="Noticias Nacionales"),
    schemas.Section(id="internacionales", label="Noticias Internacionales"),
    schemas.Section(id="opiniones", label="Opiniones"),
    schemas.Section(id="ciencias", label="Ciencias"),
    schemas.Section(id="criptos", label="Criptos"),
    schemas.Section(id="trading", label="Trading"),
    schemas.Section(id="futurologia", label="Futurología"),
    schemas.Section(id="filosofia", label="Filosofía"),
    schemas.Section(id="entretenimiento", label="Entretenimiento"),
    schemas.Section(id="curiosidades", label="Curiosidades"),
    schemas.Section(id="salud", label="Salud"),
]

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


@router.get("/sections", response_model=list[schemas.Section])
def get_sections():
    return SECTIONS


@router.get("/", response_model=list[schemas.ArticleRead])
def list_articles(
    section:str | None = None,
    q:str | None = None,
    limit:int = Query(default=20, ge=1, le=50),
    offset:int = Query(default=0, ge=0),
    db:Session = Depends(get_db),
    ):
    return crud.get_articles(db, section=section, q=q, limit=limit, offset=offset)


@router.post("/", response_model=schemas.ArticleRead, status_code=status.HTTP_201_CREATED)
def create_article(
    article_in:schemas.ArticleCreate,
    db:Session = Depends(get_db),
    _current_user:models.User = Depends(security.get_current_admin_user),
    ):
    if crud.get_article_by_slug(db, article_in.slug):
        raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Slug already exists")
    return crud.create_article(db, article_in)


@router.get("/{slug}", response_model=schemas.ArticleFull)
def get_article(slug:str, db:Session = Depends(get_db)):
    article = crud.get_article_by_slug(db, slug)
    if not article:
        raise HTTPException(status_code=404, detail="Article not found")
    return article


@router.post("/{slug}/view")
def increment_view(slug:str, db:Session = Depends(get_db)):
    article = crud.get_article_by_slug(db, slug)
    if not article:
        raise HTTPException(status_code=404, detail="Article not found")
    views = crud.increment_article_views(db, slug)
    return {"slug": slug, "views": views}


@router.get("/{slug}/views")
def get_views(slug:str, db:Session = Depends(get_db)):
    article = crud.get_article_by_slug(db, slug)
    if not article:
        raise HTTPException(status_code=404, detail="Article not found")
    return {"slug": slug, "views": article.views}
