from ..models import db, Usuario

def obter_descendentes_ids(usuario_id):
    """Retorna recursivamente uma lista com todos os IDs de usuários subordinados na árvore"""
    descendentes = []
    subordinados = Usuario.query.filter_by(cadastrador_pai_id=usuario_id).all()
    for sub in subordinados:
        descendentes.append(sub.id)
        descendentes.extend(obter_descendentes_ids(sub.id))
    return descendentes

def validar_novo_pai(usuario_id, novo_pai_id, campanha_id):
    """
    Valida se um novo_pai_id pode ser atribuído ao usuario_id:
    1. Não pode ser o próprio usuário (auto-referência)
    2. Não pode ser um descendente do próprio usuário (prevenção de ciclo)
    3. Pai deve pertencer à mesma campanha
    4. Pai deve possuir um perfil permitido
    """
    if not novo_pai_id:
        return True, ""
        
    if usuario_id and usuario_id == novo_pai_id:
        return False, "Um usuário não pode ser seu próprio superior hierárquico."
        
    pai = db.session.get(Usuario, novo_pai_id)
    if not pai:
        return False, "Superior hierárquico informado não existe."
        
    if campanha_id and pai.campanha_id != campanha_id:
        return False, "O superior hierárquico deve pertencer à mesma campanha."
        
    if usuario_id:
        descendentes = obter_descendentes_ids(usuario_id)
        if novo_pai_id in descendentes:
            return False, f"Ciclo detectado! {pai.nome} já é subordinado a este usuário."
            
    return True, ""
