from flask import Blueprint, render_template, session, request, Response, flash
from sqlalchemy import func
from ..models import db, Pessoa, Usuario, Campanha
from ..utils.auth_decorators import login_required
import csv
import io

relatorios_bp = Blueprint('relatorios', __name__, url_prefix='/relatorios')

@relatorios_bp.route('/')
@login_required
def index():
    campanha_id = session.get('campanha_id')
    campanha = Campanha.query.get(campanha_id) if campanha_id else None
    
    # Resumo territorial
    bairros_resumo = db.session.query(
        Pessoa.bairro, Pessoa.zona, func.count(Pessoa.id).label('total')
    ).filter(
        Pessoa.campanha_id == campanha_id if campanha_id else True
    ).group_by(Pessoa.bairro, Pessoa.zona).order_by(func.count(Pessoa.id).desc()).all()
    
    # Resumo por cadastrador
    cadastradores_resumo = db.session.query(
        Usuario.nome, func.count(Pessoa.id).label('total')
    ).join(Pessoa, Pessoa.cadastrador_id == Usuario.id).filter(
        Usuario.campanha_id == campanha_id if campanha_id else True
    ).group_by(Usuario.nome).order_by(func.count(Pessoa.id).desc()).all()
    
    return render_template(
        'relatorios/lista.html',
        campanha=campanha,
        bairros_resumo=bairros_resumo,
        cadastradores_resumo=cadastradores_resumo
    )

@relatorios_bp.route('/exportar/csv')
@login_required
def exportar_csv():
    campanha_id = session.get('campanha_id')
    pessoas = Pessoa.query.filter_by(campanha_id=campanha_id).order_by(Pessoa.criado_em.desc()).all() if campanha_id else []
    
    output = io.StringIO()
    writer = csv.writer(output, delimiter=';')
    writer.writerow(['ID', 'Nome Completo', 'Telefone', 'Sexo', 'Bairro', 'Zona', 'Município', 'Cadastrador', 'Data Cadastro'])
    
    for p in pessoas:
        writer.writerow([
            p.id,
            p.nome_completo,
            p.telefone or '',
            p.sexo or '',
            p.bairro,
            p.zona,
            p.municipio,
            p.cadastrador.nome if p.cadastrador else '',
            p.criado_em.strftime('%d/%m/%Y %H:%M')
        ])
        
    output.seek(0)
    return Response(
        output.getvalue(),
        mimetype="text/csv",
        headers={"Content-disposition": "attachment; filename=relatorio_mobilizacao.csv"}
    )
