from controllers.base_controller import BaseController
from models.auxiliares import Auxiliar
from models.capitanes import Capitan
from models.coordinadores import Coordinador
from sqlalchemy.orm import selectinload

class AuxiliaresController(BaseController):
    def __init__(self, session=None):
        super().__init__(model=Auxiliar, session=session)

    def listar_auxiliares(self):
        db = self.session if self.session else self.get_db_session()
        try:
            query = self.query_activa(db).options(selectinload(Auxiliar.capitan).selectinload(Capitan.coordinador).selectinload(Coordinador.area))
            return query.all()
        finally:
            if not self.session:
                db.close()

    def crear_auxiliar(self, datos, user_context=None):
        def operacion(db):
            # Limpieza de datos jerárquicos redundantes
            datos.pop('id_area', None)
            nuevo = Auxiliar(**datos)
            db.add(nuevo)
            return nuevo
        return self.ejecutar_transaccion(operacion, "Auxiliar registrado exitosamente", user_context)

    def actualizar_auxiliar(self, id, datos, user_context=None):
        def operacion(db):
            auxiliar = self.query_activa(db).filter(Auxiliar.id == id).first()
            if not auxiliar: raise ValueError("Auxiliar no encontrado.")
            datos.pop('id_area', None)
            for key, value in datos.items(): setattr(auxiliar, key, value)
        return self.ejecutar_transaccion(operacion, "Auxiliar actualizado.", user_context)

    def eliminar_auxiliar(self, id, user_context=None):
        def operacion(db):
            auxiliar = self.query_activa(db).filter(Auxiliar.id == id).first()
            if not auxiliar: raise ValueError("Auxiliar no encontrado.")
            self.marcar_eliminado(auxiliar, db)
        return self.ejecutar_transaccion(operacion, "Auxiliar eliminado.", user_context)
