from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for, flash, session
from ..models import db, Campanha, Usuario, AuditoriaLog
from ..utils.auth_decorators import login_required, dev_required, admin_required, write_required

campanhas_bp = Blueprint('campanhas', __name__, url_prefix='/campanhas')

@campanhas_bp.route('/setup', methods=['GET', 'POST'])
@login_required
@dev_required
def setup():
    """Tela 'Configuração da Operação' para o DEV/Superadmin inicializar a campanha"""
    campanha_existente = Campanha.query.filter_by(ativa=True).first()
    
    if request.method == 'POST':
        nome = request.form.get('nome', '').strip()
        candidato = request.form.get('candidato', '').strip()
        cargo = request.form.get('cargo', '').strip()
        municipio = request.form.get('municipio', 'Manaus').strip()
        estado = request.form.get('estado', 'AM').strip()
        partido_coligacao = request.form.get('partido_coligacao', '').strip()
        slogan = request.form.get('slogan', '').strip()
        
        meta_total = int(request.form.get('meta_total', 2500))
        meta_por_cadastrador = int(request.form.get('meta_por_cadastrador', 25))
        
        data_inicio_str = request.form.get('data_inicio')
        data_fim_str = request.form.get('data_fim')
        
        data_inicio = datetime.strptime(data_inicio_str, '%Y-%m-%d').date() if data_inicio_str else None
        data_fim = datetime.strptime(data_fim_str, '%Y-%m-%d').date() if data_fim_str else None
        
        if campanha_existente:
            campanha = campanha_existente
            campanha.nome = nome
            campanha.candidato = candidato
            campanha.cargo = cargo
            campanha.municipio = municipio
            campanha.estado = estado
            campanha.partido_coligacao = partido_coligacao
            campanha.slogan = slogan
            campanha.meta_total = meta_total
            campanha.meta_por_cadastrador = meta_por_cadastrador
            campanha.data_inicio = data_inicio
            campanha.data_fim = data_fim
            
            if request.form.get('atualizar_todos_multiplicadores') == 'on':
                from ..models import MetaCadastrador
                metas_existentes = MetaCadastrador.query.filter_by(campanha_id=campanha.id).all()
                for m in metas_existentes:
                    m.meta = meta_por_cadastrador
                flash(f'Configuração atualizada! A meta de todos os {len(metas_existentes)} multiplicadores foi redefinida para {meta_por_cadastrador}.', 'success')
            else:
                flash('Configuração da Operação atualizada com sucesso!', 'success')
        else:
            campanha = Campanha(
                nome=nome,
                candidato=candidato,
                cargo=cargo,
                municipio=municipio,
                estado=estado,
                partido_coligacao=partido_coligacao,
                slogan=slogan,
                meta_total=meta_total,
                meta_por_cadastrador=meta_por_cadastrador,
                data_inicio=data_inicio,
                data_fim=data_fim,
                ativa=True
            )
            db.session.add(campanha)
            db.session.flush()
            flash('Nova operação configurada com sucesso!', 'success')
            
        # Liberar ou criar Administrador Principal
        admin_email = request.form.get('admin_email', '').strip()
        admin_nome = request.form.get('admin_nome', '').strip()
        admin_senha = request.form.get('admin_senha', '')
        
        if admin_email and admin_senha:
            admin_user = Usuario.query.filter_by(email=admin_email).first()
            if not admin_user:
                admin_user = Usuario(
                    nome=admin_nome or 'Administrador Principal',
                    email=admin_email,
                    perfil=Usuario.ROLE_ADMIN,
                    campanha_id=campanha.id,
                    criado_por_id=session.get('usuario_id')
                )
                admin_user.set_senha(admin_senha)
                db.session.add(admin_user)
                flash(f'Administrador principal ({admin_email}) criado e atrelado à operação.', 'success')
            else:
                admin_user.campanha_id = campanha.id
                admin_user.perfil = Usuario.ROLE_ADMIN
                
        # Atualizar sessão DEV
        dev_user = Usuario.query.get(session.get('usuario_id'))
        if dev_user:
            dev_user.campanha_id = campanha.id
            session['campanha_id'] = campanha.id
            
        db.session.commit()
        
        AuditoriaLog.registrar(
            usuario_id=session.get('usuario_id'),
            usuario_nome=session.get('usuario_nome'),
            acao='SETUP_CAMPANHA',
            entidade='Campanha',
            entidade_id=campanha.id,
            detalhes=f'Configuração da Operação: {campanha.nome}',
            ip=request.remote_addr
        )
        
        return redirect(url_for('dashboards.index'))
        
    return render_template('campanhas/setup.html', campanha=campanha_existente)
