from sqlalchemy import select
from utils import logger
from db import CRUD
from db.schemas.categories import Category
from db.handlers.records import ServiceRecordsHandler


class CategoryHandler:
    async def add(newCategoryData: dict, user_id: int = None):
        title = newCategoryData.get("title", None)
        if not title:
            logger.error("Не указано название категории")
            return {}
        query = select(Category).where(Category.title == title)
        category = await CRUD.read(query)
        if category:
            logger.error("Категория с таким названием уже существует")
            return {}
        try:
            newCategory = await Category(**newCategoryData).save()
        except Exception as e:
            logger.error(f"Ошибка сохранения категории: {str(e)}")
            return {}
        if not newCategory:
            logger.error("Категория не сохранена")
            return {}
        await ServiceRecordsHandler.add(
            user_id, {"Добавлена категория": newCategory.toDict()}
        )
        logger.info(
            f"Категория {newCategory.title} успешно добавлена, id: {newCategory.id}"
        )
        return newCategory.toDict()

    async def edit(categoryId: int, **kwargs):
        query = select(Category).where(Category.id == categoryId)
        category = await CRUD.read(query)
        if not category:
            logger.error("Категория не найдена")
            return {}
        try:
            user_id = kwargs.get("user_id", None)
            editedCategory = await category.edit(**kwargs)
        except Exception as e:
            logger.error(f"Ошибка обновления категории: {str(e)}")
            return {}
        if not editedCategory:
            logger.error("Категория не обновлена")
            return {}
        await ServiceRecordsHandler.add(
            user_id, {f"Обновлена категория {category.title}": editedCategory.toDict()}
        )
        logger.info(f"Категория {editedCategory.title} успешно обновлена")
        return editedCategory.toDict()

    async def getAll() -> list[dict]:
        query = select(Category)
        categories = await CRUD.read(query, True)
        return [category.toDict() for category in categories] if categories else []

    async def getSeveral(categoryIds: list[int]) -> list[dict]:
        query = select(Category).where(Category.id.in_(categoryIds))
        categories = await CRUD.read(query, True)
        return [category.toDict() for category in categories] if categories else []

    async def delete(categoryId: int, user_id: int = None):
        query = select(Category).where(Category.id == categoryId)
        category = await CRUD.read(query)
        if not category:
            logger.error("Категория не найдена")
            return False
        try:
            categoryTitle = category.title
            result = await CRUD.delete(category)
        except Exception as e:
            logger.error(f"Ошибка удаления категории: {str(e)}")
            return False
        await ServiceRecordsHandler.add(
            user_id, {"Удалена категория": f"Название: {categoryTitle}"}
        )
        logger.info(
            f"Категория {categoryTitle} {'успешно удалена' if result else 'не удалена'}"
        )
        return result

    async def initialize():
        baseCategories = [
            {"title": "Фрезеровка", "description": "Инструмент для фрезерного цеха"},
            {"title": "Токарка", "description": "Инструмент для токарного цеха"},
            {"title": "Слесарка", "description": "Инструмент для слесарного цеха"},
        ]

        logger.info("Создание базовых категорий")
        for categoryData in baseCategories:
            await CategoryHandler.add(categoryData)

        logger.info("Категории успешно созданы")
        return
