from sqlalchemy.orm import Session
from typing import Optional, List
from app.models.category import Category
from app.schemas.category import CategoryCreate, CategoryUpdate


class CategoryCRUD:
    def get_by_id(self, db: Session, category_id: int) -> Optional[Category]:
        """Obtenir une catégorie par ID"""
        return db.query(Category).filter(Category.id == category_id).first()
    
    def get_by_slug(self, db: Session, slug: str) -> Optional[Category]:
        """Obtenir une catégorie par slug"""
        return db.query(Category).filter(Category.slug == slug).first()
    
    def get_all(self, db: Session, skip: int = 0, limit: int = 100) -> List[Category]:
        """Obtenir toutes les catégories"""
        return db.query(Category).filter(Category.is_active == True).order_by(Category.sort_order).offset(skip).limit(limit).all()
    
    def create(self, db: Session, category_create: CategoryCreate) -> Category:
        """Créer une nouvelle catégorie"""
        db_category = Category(**category_create.dict())
        db.add(db_category)
        db.commit()
        db.refresh(db_category)
        return db_category
    
    def update(self, db: Session, category_id: int, category_update: CategoryUpdate) -> Optional[Category]:
        """Mettre à jour une catégorie"""
        db_category = self.get_by_id(db, category_id)
        if not db_category:
            return None
        
        update_data = category_update.dict(exclude_unset=True)
        for field, value in update_data.items():
            setattr(db_category, field, value)
        
        db.commit()
        db.refresh(db_category)
        return db_category
    
    def delete(self, db: Session, category_id: int) -> bool:
        """Supprimer une catégorie"""
        db_category = self.get_by_id(db, category_id)
        if not db_category:
            return False
        
        db.delete(db_category)
        db.commit()
        return True
    
    def toggle_active(self, db: Session, category_id: int) -> Optional[Category]:
        """Activer/désactiver une catégorie"""
        db_category = self.get_by_id(db, category_id)
        if not db_category:
            return None
        
        db_category.is_active = not db_category.is_active
        db.commit()
        db.refresh(db_category)
        return db_category


category_crud = CategoryCRUD()
