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

dashboards_bp = Blueprint('dashboards', __name__)

@dashboards_bp.route('/')
@dashboards_bp.route('/dashboard')
@login_required
def index():
    campanha_id = session.get('campanha_id')
    user_role = session.get('usuario_perfil')
    
    if user_role == Usuario.ROLE_CADASTRADOR:
        return render_template('cadastros/meus.html')
        
    try:
        campanha = db.session.get(Campanha, campanha_id) if campanha_id else Campanha.query.first()
    except Exception:
        db.create_all()
        from .. import _auto_seed_if_empty
        _auto_seed_if_empty()
        campanha = Campanha.query.first()

    if not campanha:
        campanha = Campanha.query.first()
        if campanha:
            session['campanha_id'] = campanha.id
    
    # 1. Total Pessoas Cadastradas
    total_cadastrados = db.session.query(func.count(Pessoa.id)).scalar() or 0
    
    # 2. Cadastradores Ativos
    total_cadastradores = db.session.query(func.count(Usuario.id)).filter(
        Usuario.perfil == Usuario.ROLE_CADASTRADOR,
        Usuario.ativo == True
    ).scalar() or 0
    
    # 3. Meta Geral
    meta_total = campanha.meta_total if campanha else 10000
    percentual_meta = min(round((total_cadastrados / meta_total) * 100, 1), 100.0) if meta_total > 0 else 100.0
    
    # 4. Cadastros Hoje
    hoje_inicio = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0)
    cadastros_hoje = db.session.query(func.count(Pessoa.id)).filter(
        Pessoa.criado_em >= hoje_inicio
    ).scalar() or 0
    
    # 5. Cobertura Territorial (Bairros Cobertos)
    bairros_cobertos = db.session.query(func.count(func.distinct(Pessoa.bairro))).scalar() or 0
    
    # 6. Top 5 Cadastradores
    cadastradores = Usuario.query.filter_by(perfil=Usuario.ROLE_CADASTRADOR).all()
    meta_default = campanha.meta_por_cadastrador if campanha else 25
    top_cadastradores_raw = []
    
    for c in cadastradores:
        cnt = len(c.cadastros)
        meta_usr = c.meta_rel.meta if c.meta_rel else meta_default
        pct = min(round((cnt / meta_usr) * 100, 1), 100.0) if meta_usr > 0 else 100.0
        top_cadastradores_raw.append({
            'id': c.id,
            'nome': c.nome,
            'total': cnt,
            'meta': meta_usr,
            'percentual': pct
        })
        
    top_cadastradores_raw.sort(key=lambda x: x['total'], reverse=True)
    top_cadastradores = top_cadastradores_raw[:5]

    # 7. Top 5 Bairros com Maior Mobilização
    top_bairros_raw = db.session.query(
        Pessoa.bairro, Pessoa.zona, func.count(Pessoa.id).label('total')
    ).group_by(Pessoa.bairro, Pessoa.zona).order_by(func.count(Pessoa.id).desc()).limit(5).all()

    top_bairros = [{'bairro': b[0], 'zona': b[1], 'total': b[2]} for b in top_bairros_raw]
    
    # 8. Evolução nos últimos 30 dias para Chart.js
    evolucao_diaria = []
    for i in range(29, -1, -1):
        dia = datetime.utcnow().date() - timedelta(days=i)
        cnt_dia = db.session.query(func.count(Pessoa.id)).filter(
            func.date(Pessoa.criado_em) == dia
        ).scalar() or 0
        evolucao_diaria.append({'data': dia.strftime('%d/%m'), 'total': cnt_dia})
        
    # 9. Distribuição por Zona Urbana
    distribuicao_zonas_raw = db.session.query(
        Pessoa.zona, func.count(Pessoa.id).label('total')
    ).group_by(Pessoa.zona).order_by(func.count(Pessoa.id).desc()).all()

    distribuicao_zonas = [{'zona': z[0], 'total': z[1]} for z in distribuicao_zonas_raw]

    return render_template(
        'dashboards/admin.html',
        campanha=campanha,
        total_cadastrados=total_cadastrados,
        total_cadastradores=total_cadastradores,
        meta_total=meta_total,
        percentual_meta=percentual_meta,
        cadastros_hoje=cadastros_hoje,
        bairros_cobertos=bairros_cobertos,
        top_cadastradores=top_cadastradores,
        top_bairros=top_bairros,
        evolucao_diaria=evolucao_diaria,
        distribuicao_zonas=distribuicao_zonas
    )

@dashboards_bp.route('/manual')
@login_required
def manual():
    """Manual do Usuário interativo por perfil"""
    user_id = session.get('usuario_id')
    current_user = db.session.get(Usuario, user_id)
    return render_template('manual.html', current_user=current_user)
