from flask import Blueprint, render_template, request, redirect, url_for, flash, session
from ..models import db, Usuario, Campanha, AuditoriaLog

auth_bp = Blueprint('auth', __name__)

@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        login_input = request.form.get('login_input', '').strip()
        senha = request.form.get('senha', '')
        
        # Suporte para login por E-mail ou CPF
        cpf_digits = ''.join(c for c in login_input if c.isdigit())
        
        query = Usuario.query.filter(
            (Usuario.email == login_input) |
            (Usuario.cpf == login_input)
        )
        if cpf_digits:
            query = Usuario.query.filter(
                (Usuario.email == login_input) |
                (Usuario.cpf == login_input) |
                (Usuario.cpf == cpf_digits)
            )
            
        usuario = query.first()
        
        if usuario and usuario.check_senha(senha):
            if not usuario.ativo:
                session.clear()
                flash('Sua conta está inativa. Contate o Administrador.', 'danger')
                return redirect(url_for('auth.login'))
                
            # Limpa qualquer sessão anterior antes de autenticar o novo usuário
            session.clear()

            # Verifica se é Primeiro Acesso (troca de senha obrigatória)
            if usuario.primeiro_acesso:
                session['primeiro_acesso_user_id'] = usuario.id
                flash('Primeiro acesso detectado! Escolha sua nova senha pessoal para continuar.', 'warning')
                return redirect(url_for('auth.primeiro_acesso'))
                
            session['usuario_id'] = usuario.id
            session['usuario_nome'] = usuario.nome
            session['usuario_email'] = usuario.email or usuario.cpf
            session['usuario_perfil'] = usuario.perfil
            session['campanha_id'] = usuario.campanha_id
            
            AuditoriaLog.registrar(
                usuario_id=usuario.id,
                usuario_nome=usuario.nome,
                acao='LOGIN',
                entidade='Usuario',
                entidade_id=usuario.id,
                detalhes='Login efetuado com sucesso',
                ip=request.remote_addr
            )
            
            flash(f'Bem-vindo, {usuario.nome}!', 'success')
            
            if usuario.perfil == Usuario.ROLE_CADASTRADOR:
                return redirect(url_for('cadastros.meus'))
            elif usuario.perfil == Usuario.ROLE_DEV and not usuario.campanha_id:
                return redirect(url_for('campanhas.setup'))
            return redirect(url_for('dashboards.index'))
            
        session.clear()
        flash('CPF/E-mail ou senha incorretos.', 'danger')
        return redirect(url_for('auth.login'))

    # Se requisição for GET e usuário já estiver autenticado, redireciona para seu painel
    if 'usuario_id' in session and session['usuario_id']:
        usr = db.session.get(Usuario, session['usuario_id'])
        if usr and usr.ativo:
            if usr.perfil == Usuario.ROLE_CADASTRADOR:
                return redirect(url_for('cadastros.meus'))
            return redirect(url_for('dashboards.index'))
        else:
            session.clear()
        
    return render_template('auth/login.html')

@auth_bp.route('/primeiro-acesso', methods=['GET', 'POST'])
def primeiro_acesso():
    user_id = session.get('primeiro_acesso_user_id')
    if not user_id:
        return redirect(url_for('auth.login'))
        
    usuario = db.session.get(Usuario, user_id)
    if not usuario:
        session.pop('primeiro_acesso_user_id', None)
        return redirect(url_for('auth.login'))
        
    if request.method == 'POST':
        nova_senha = request.form.get('nova_senha', '')
        confirmar_senha = request.form.get('confirmar_senha', '')
        
        if not nova_senha or len(nova_senha) < 6:
            flash('A nova senha deve ter no mínimo 6 caracteres.', 'danger')
            return render_template('auth/primeiro_acesso.html', usuario=usuario)
            
        if nova_senha != confirmar_senha:
            flash('A senha e a confirmação de senha não coincidem.', 'danger')
            return render_template('auth/primeiro_acesso.html', usuario=usuario)
            
        # Atualiza senha e finaliza o Primeiro Acesso
        usuario.set_senha(nova_senha)
        usuario.primeiro_acesso = False
        db.session.commit()
        
        session.pop('primeiro_acesso_user_id', None)
        session['usuario_id'] = usuario.id
        session['usuario_nome'] = usuario.nome
        session['usuario_email'] = usuario.email or usuario.cpf
        session['usuario_perfil'] = usuario.perfil
        session['campanha_id'] = usuario.campanha_id
        
        AuditoriaLog.registrar(
            usuario_id=usuario.id,
            usuario_nome=usuario.nome,
            acao='PRIMEIRO_ACESSO_REDEFINICAO',
            entidade='Usuario',
            entidade_id=usuario.id,
            detalhes='Nova senha pessoal definida no primeiro acesso',
            ip=request.remote_addr
        )
        
        flash('Sua nova senha foi cadastrada com sucesso! Bem-vindo ao sistema.', 'success')
        if usuario.perfil == Usuario.ROLE_CADASTRADOR:
            return redirect(url_for('cadastros.meus'))
        return redirect(url_for('dashboards.index'))
        
    return render_template('auth/primeiro_acesso.html', usuario=usuario)

@auth_bp.route('/esqueci-senha', methods=['GET', 'POST'])
def esqueci_senha():
    if request.method == 'POST':
        identificador = request.form.get('identificador', '').strip()
        cpf_digits = ''.join(c for c in identificador if c.isdigit())
        
        query = Usuario.query.filter(
            (Usuario.email == identificador) |
            (Usuario.cpf == identificador)
        )
        if cpf_digits:
            query = Usuario.query.filter(
                (Usuario.email == identificador) |
                (Usuario.cpf == identificador) |
                (Usuario.cpf == cpf_digits)
            )
            
        usuario = query.first()
        
        if usuario:
            usuario.solicitou_reset = True
            db.session.commit()
            
            AuditoriaLog.registrar(
                usuario_id=usuario.id,
                usuario_nome=usuario.nome,
                acao='SOLICITACAO_RESET_SENHA',
                entidade='Usuario',
                entidade_id=usuario.id,
                detalhes=f'Solicitação de redefinição de senha para o usuário {usuario.nome}',
                ip=request.remote_addr
            )
            
            flash(f'Solicitação registrada com sucesso! Fale com o seu superior ou Administrador para resetar a sua senha.', 'success')
            return redirect(url_for('auth.login'))
        else:
            flash('Nenhuma conta encontrada com o CPF ou E-mail informado.', 'danger')
            
    return render_template('auth/esqueci_senha.html')

@auth_bp.route('/logout')
def logout():
    uid = session.get('usuario_id')
    unome = session.get('usuario_nome')
    if uid:
        AuditoriaLog.registrar(
            usuario_id=uid,
            usuario_nome=unome,
            acao='LOGOUT',
            entidade='Usuario',
            entidade_id=uid,
            detalhes='Logout do sistema',
            ip=request.remote_addr
        )
    session.clear()
    flash('Você saiu do sistema.', 'info')
    return redirect(url_for('auth.login'))
