from flask import Blueprint, request, render_template, redirect, url_for, flash, jsonify
from functions.database import get_db_connection, Usuario, Role, Setor
from functions.decorators import require_login
from flask_login import current_user
import pyotp

usuario_bp = Blueprint('usuario', __name__)

@usuario_bp.route("/usuarios/novo", methods=["GET", "POST"])
@require_login
def novo():
    """Cria um novo usuário"""
    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        email = request.form.get("email")
        role_id = request.form.get("role_id")
        setor_id = request.form.get("setor_id")

        # Verificar se usuário já existe
        db = get_db_connection()
        try:
            if db.query(Usuario).filter_by(username=username).first():
                flash('Nome de usuário já existe.', 'danger')
                return render_template("novo_usuario.html")

            novo_usuario = Usuario(
                username=username,
                email=email,
                role_id=role_id,
                setor_id=setor_id
            )
            novo_usuario.set_password(password)
            novo_usuario.otp_secret = pyotp.random_base32()

            db.add(novo_usuario)
            db.commit()
            flash('Usuário cadastrado com sucesso!', 'success')
            return redirect(url_for('usuario.listar'))
        except Exception as e:
            db.rollback()
            print(f"Erro ao cadastrar usuário: {e}")
            flash('Erro ao cadastrar usuário', 'danger')
            return render_template("novo_usuario.html")
        finally:
            db.close()

    db = get_db_connection()
    try:
        roles = db.query(Role).order_by(Role.nome).all()
        setores = db.query(Setor).order_by(Setor.nome).all()
        return render_template("novo_usuario.html", roles=roles, setores=setores)
    finally:
        db.close()

@usuario_bp.route('/usuarios/<int:user_id>/toggle_status', methods=['POST'])
@require_login
def toggle_status(user_id):
    """Ativa/desativa um usuário"""
    if not current_user.is_admin:
        return jsonify({
            'success': False,
            'error': 'Você não tem permissão para alterar o status de usuários.'
        }), 403

    db = get_db_connection()
    try:
        usuario = db.query(Usuario).get(user_id)
        if not usuario:
            return jsonify({
                'success': False,
                'error': 'Usuário não encontrado.'
            }), 404

        usuario.ativo = not usuario.ativo
        db.commit()
        
        return jsonify({
            'success': True,
            'message': f'Usuário {"ativado" if usuario.ativo else "desativado"} com sucesso!'
        })
    except Exception as e:
        db.rollback()
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500
    finally:
        db.close()

@usuario_bp.route('/usuarios/<int:user_id>/alterar_nivel', methods=['POST'])
@require_login
def alterar_nivel(user_id):
    """Altera o nível de acesso de um usuário"""
    if not current_user.is_admin:
        return jsonify({
            'success': False,
            'error': 'Você não tem permissão para alterar níveis de usuários.'
        }), 403

    novo_nivel = request.form.get('novo_nivel')
    if not novo_nivel:
        return jsonify({
            'success': False,
            'error': 'Novo nível não especificado.'
        }), 400

    db = get_db_connection()
    try:
        usuario = db.query(Usuario).get(user_id)
        if not usuario:
            return jsonify({
                'success': False,
                'error': 'Usuário não encontrado.'
            }), 404

        # Buscar role pelo nível
        role = db.query(Role).filter_by(nivel=int(novo_nivel)).first()
        if not role:
            return jsonify({
                'success': False,
                'error': 'Nível de acesso inválido.'
            }), 400

        # Limpar roles existentes e adicionar nova
        usuario.roles.clear()
        usuario.roles.append(role)
        db.commit()
        
        return jsonify({
            'success': True,
            'message': f'Nível de acesso alterado para {role.nome} com sucesso!'
        })
    except Exception as e:
        db.rollback()
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500
    finally:
        db.close()

@usuario_bp.route('/usuarios/<int:user_id>/toggle_quadro_orientador', methods=['POST'])
@require_login
def toggle_quadro_orientador(user_id):
    """Ativa/desativa quadro orientador para um usuário"""
    if not current_user.is_admin:
        return jsonify({
            'success': False,
            'error': 'Você não tem permissão para alterar responsabilidades de usuários.'
        }), 403

    db = get_db_connection()
    try:
        usuario = db.query(Usuario).get(user_id)
        if not usuario:
            return jsonify({
                'success': False,
                'error': 'Usuário não encontrado.'
            }), 404

        # Toggle quadro orientador
        if usuario.quadro_orientador:
            usuario.quadro_orientador = False
            message = 'Quadro Orientador desativado com sucesso!'
        else:
            usuario.quadro_orientador = True
            message = 'Quadro Orientador ativado com sucesso!'

        db.commit()
        
        return jsonify({
            'success': True,
            'message': message,
            'quadro_orientador': usuario.quadro_orientador
        })
    except Exception as e:
        db.rollback()
        return jsonify({
            'success': False,
            'error': str(e)
        }), 500
    finally:
        db.close() 