from flask import Blueprint, render_template, session, jsonify
from sqlalchemy import func
from ..models import db, Usuario, Pessoa, Campanha, MetaCadastrador
from ..utils.auth_decorators import login_required

rede_bp = Blueprint('rede', __name__, url_prefix='/rede')

@rede_bp.route('/')
@login_required
def arvore():
    campanha_id = session.get('campanha_id')
    user_id = session.get('usuario_id')
    user_role = session.get('usuario_perfil')
    
    campanha = db.session.get(Campanha, campanha_id) if campanha_id else None
    
    # Se for cadastrador, visualiza a sua própria sub-árvore
    if user_role == Usuario.ROLE_CADASTRADOR:
        cadastradores = Usuario.query.filter(
            (Usuario.id == user_id) | (Usuario.cadastrador_pai_id == user_id)
        ).all()
    else:
        query = Usuario.query.filter_by(perfil=Usuario.ROLE_CADASTRADOR)
        if campanha_id:
            query = query.filter_by(campanha_id=campanha_id)
        cadastradores = query.all()
    
    meta_default = campanha.meta_por_cadastrador if campanha else 25
    rede_nodes = []
    
    for c in cadastradores:
        cadastros_qtd = len(c.cadastros)
        sub_tree_total = c.total_sub_tree_cadastros()
        sub_cadastradores_qtd = len(c.sub_cadastradores)
        
        meta_usr = c.meta_rel.meta if c.meta_rel else meta_default
        pct = min(round((cadastros_qtd / meta_usr) * 100, 1), 100.0) if meta_usr > 0 else 100.0
        
        # Bairros mais trabalhados por este cadastrador
        bairros_top = db.session.query(
            Pessoa.bairro, func.count(Pessoa.id).label('total')
        ).filter(
            Pessoa.cadastrador_id == c.id
        ).group_by(Pessoa.bairro).order_by(func.count(Pessoa.id).desc()).limit(3).all()
        
        rede_nodes.append({
            'id': c.id,
            'nome': c.nome,
            'email': c.email,
            'telefone': c.telefone,
            'cadastrador_pai_nome': c.cadastrador_pai.nome if c.cadastrador_pai else 'Raiz',
            'cadastros_qtd': cadastros_qtd,
            'sub_tree_total': sub_tree_total,
            'sub_cadastradores_qtd': sub_cadastradores_qtd,
            'meta': meta_usr,
            'percentual': pct,
            'meta_atingida': cadastros_qtd >= meta_usr,
            'bairros_top': [{'bairro': b[0], 'total': b[1]} for b in bairros_top]
        })
        
    return render_template('rede/arvore.html', campanha=campanha, rede_nodes=rede_nodes)

@rede_bp.route('/detalhe/<int:cadastrador_id>')
@login_required
def detalhe(cadastrador_id):
    cadastrador = db.session.get(Usuario, cadastrador_id)
    if not cadastrador:
        return jsonify({'error': 'Usuário não encontrado'}), 404
        
    pessoas = Pessoa.query.filter_by(cadastrador_id=cadastrador_id).order_by(Pessoa.criado_em.desc()).all()
    
    bairros_dist = db.session.query(
        Pessoa.bairro, func.count(Pessoa.id).label('total')
    ).filter(
        Pessoa.cadastrador_id == cadastrador_id
    ).group_by(Pessoa.bairro).all()
    
    return jsonify({
        'cadastrador': cadastrador.to_dict(),
        'total_cadastros_diretos': len(pessoas),
        'total_sub_tree': cadastrador.total_sub_tree_cadastros(),
        'sub_cadastradores': [s.to_dict() for s in cadastrador.sub_cadastradores],
        'bairros': [{'bairro': b[0], 'total': b[1]} for b in bairros_dist],
        'ultimos_cadastros': [p.to_dict() for p in pessoas[:5]]
    })
