from datetime import datetime
from flask import Blueprint, request, jsonify, session
from ..models import db, Pessoa, MetaCadastrador, AuditoriaLog
from ..utils.auth_decorators import login_required

api_sync_bp = Blueprint('api_sync', __name__, url_prefix='/api/sync')

@api_sync_bp.route('/push', methods=['POST'])
@login_required
def push_offline_records():
    """Recebe registros criados offline no IndexedDB do cadastrador e grava no banco SQL"""
    data = request.get_json()
    if not data or 'cadastros' not in data:
        return jsonify({'error': 'Dados inválidos'}), 400
        
    usuario_id = session.get('usuario_id')
    campanha_id = session.get('campanha_id')
    
    cadastrados_sucesso = 0
    erros = []
    
    for item in data['cadastros']:
        client_uuid = item.get('client_uuid')
        
        # Evitar duplicidades checando client_uuid
        if client_uuid and Pessoa.query.filter_by(client_uuid=client_uuid).first():
            continue
            
        data_nasc_str = item.get('data_nascimento')
        data_nasc = datetime.strptime(data_nasc_str, '%Y-%m-%d').date() if data_nasc_str else None
        
        pessoa = Pessoa(
            nome_completo=item.get('nome_completo', '').strip(),
            telefone=item.get('telefone', '').strip(),
            data_nascimento=data_nasc,
            sexo=item.get('sexo', ''),
            cep=item.get('cep', ''),
            rua=item.get('rua', ''),
            bairro=item.get('bairro', 'Centro'),
            zona=item.get('zona', 'Zona Norte'),
            municipio=item.get('municipio', 'Manaus'),
            titulo_eleitor=item.get('titulo_eleitor', '').strip(),
            zona_eleitoral=item.get('zona_eleitoral', '').strip(),
            secao_eleitoral=item.get('secao_eleitoral', '').strip(),
            observacao=item.get('observacao', ''),
            cadastrador_id=usuario_id,
            campanha_id=campanha_id or 1,
            sincronizado_offline=True,
            client_uuid=client_uuid
        )
        db.session.add(pessoa)
        cadastrados_sucesso += 1
        
    if cadastrados_sucesso > 0:
        meta_obj = MetaCadastrador.query.filter_by(cadastrador_id=usuario_id).first()
        if meta_obj:
            meta_obj.quantidade_atual += cadastrados_sucesso
            
        db.session.commit()
        
        AuditoriaLog.registrar(
            usuario_id=usuario_id,
            usuario_nome=session.get('usuario_nome'),
            acao='SYNC_OFFLINE_PUSH',
            entidade='Pessoa',
            detalhes=f'Sincronizados {cadastrados_sucesso} registros offline via PWA',
            ip=request.remote_addr
        )
        
    return jsonify({
        'status': 'sucesso',
        'processados': cadastrados_sucesso,
        'erros': erros
    })
