from datetime import datetime, UTC
from sqlalchemy.exc import SQLAlchemyError
from functions.database import get_db_connection, Controle as ControleModel

class Controle:
    def __init__(self):
        self.db = get_db_connection()

    def registrar_controle(self, militante_id: int, tipo: str, valor: float, observacao: str = None) -> bool:
        """
        Registra um novo controle no sistema
        
        Args:
            militante_id: ID do militante
            tipo: Tipo do controle (ex: 'pagamento', 'cota')
            valor: Valor do controle
            observacao: Observação opcional sobre o controle
            
        Returns:
            bool: True se o controle foi registrado com sucesso, False caso contrário
        """
        try:
            data_registro = datetime.now(UTC)
            
            novo_controle = ControleModel(
                militante_id=militante_id,
                tipo=tipo,
                valor=valor,
                data_registro=data_registro,
                observacao=observacao
            )
            
            self.db.add(novo_controle)
            self.db.commit()
            return True
            
        except SQLAlchemyError as e:
            self.db.rollback()
            print(f"Erro ao registrar controle: {str(e)}")
            return False
        finally:
            self.db.close()

    def listar_controles(self, militante_id: int = None) -> list:
        """
        Lista os controles registrados no sistema
        
        Args:
            militante_id: ID do militante para filtrar (opcional)
            
        Returns:
            list: Lista de controles encontrados
        """
        try:
            query = self.db.query(ControleModel)
            
            if militante_id:
                query = query.filter(ControleModel.militante_id == militante_id)
                
            return query.all()
            
        except SQLAlchemyError as e:
            print(f"Erro ao listar controles: {str(e)}")
            return []
        finally:
            self.db.close()

    def buscar_controle(self, controle_id: int) -> ControleModel:
        """
        Busca um controle específico pelo ID
        
        Args:
            controle_id: ID do controle
            
        Returns:
            ControleModel: Objeto do controle encontrado ou None
        """
        try:
            return self.db.query(ControleModel).filter(ControleModel.id == controle_id).first()
        except SQLAlchemyError as e:
            print(f"Erro ao buscar controle: {str(e)}")
            return None
        finally:
            self.db.close() 