from sqlalchemy.orm import Session
from app import models, schemas


# --- User ---

def get_user_by_id(db:Session, user_id:int) -> models.User | None:
    return db.query(models.User).filter(models.User.id == user_id).first()

def get_user_by_username(db:Session, username:str) -> models.User | None:
    return db.query(models.User).filter(models.User.username == username).first()

def get_user_by_email(db:Session, email:str) -> models.User | None:
    return db.query(models.User).filter(models.User.email == email).first()

def create_user(db:Session, username:str, email:str, hashed_password:str) -> models.User:
    user = models.User(username=username, email=email, hashed_password=hashed_password)
    db.add(user)
    db.commit()
    db.refresh(user)
    return user

def get_users(db:Session) -> list[models.User]:
    return db.query(models.User).all()


# --- Article ---

def get_articles(db:Session, section:str | None = None, q:str | None = None, limit:int = 20, offset:int = 0) -> list[models.Article]:
    query = db.query(models.Article)
    if section:
        query = query.filter(models.Article.section == section)
    if q:
        query = query.filter(
            models.Article.title.ilike(f"%{q}%") |
            models.Article.excerpt.ilike(f"%{q}%")
        )
    return query.offset(offset).limit(limit).all()

def get_article_by_slug(db:Session, slug:str) -> models.Article | None:
    return db.query(models.Article).filter(models.Article.slug == slug).first()

def create_article(db:Session, article_in:schemas.ArticleCreate) -> models.Article:
    article = models.Article(**article_in.model_dump())
    db.add(article)
    db.commit()
    db.refresh(article)
    return article

def increment_article_views(db:Session, slug:str) -> int:
    article = get_article_by_slug(db, slug)
    if not article:
        return 0
    article.views += 1
    db.commit()
    db.refresh(article)
    return article.views
