# -*- coding: utf-8 -*-
# /var/www/html/fluxo_roteador.py

import json
import importlib
from utils_hibrido import registrar_log, enviar_whatsapp, obter_mensagem_db, limpar_cpf_cnpj

def processar(conn, cursor, job, atendimento, configs, mensagem_bruta):
    atendimento_id = atendimento['id']
    numero = atendimento['cliente_numero']
    estado_atual = atendimento.get('estado_atual', 'INICIO')
    
    raw_ctx = atendimento.get('contexto_json')
    ctx = json.loads(raw_ctx) if raw_ctx else {}
    
    registrar_log('FLUXO_ROTEADOR', f"Protocolo {atendimento.get('protocolo')} - Estado: {estado_atual}")
    
    # Verifica se o cliente já enviou CPF na mensagem
    cpf_cnpj = limpar_cpf_cnpj(mensagem_bruta)
    if len(cpf_cnpj) in (11, 14):
        registrar_log('FLUXO_ROTEADOR', f"CPF detectado: {cpf_cnpj}")
        cursor.execute("""
            UPDATE atendimentos
            SET cliente_cpf = %s, fluxo_atual = 'IDENTIFICACAO', estado_atual = 'PROCESSAR_DOCUMENTO', contexto_json = %s
            WHERE id = %s
        """, (cpf_cnpj, json.dumps({'cpf': cpf_cnpj}), atendimento_id))
        conn.commit()
        
        cursor.execute("SELECT * FROM atendimentos WHERE id = %s", (atendimento_id,))
        novo_atend = dict(cursor.fetchone())
        novo_atend['contexto_json'] = json.dumps({'cpf': cpf_cnpj})
        fluxo_identificacao = importlib.import_module('fluxo_identificacao')
        fluxo_identificacao.processar(conn, cursor, job, novo_atend, configs, mensagem_bruta)
        return
    
    # Estado INICIO: apenas envia saudação e AGUARDA o cliente responder
    if estado_atual == 'INICIO':
        msg_saudacao = obter_mensagem_db(cursor, 'msg_saudacao_inicial')
        if msg_saudacao:
            enviar_whatsapp(configs, numero, msg_saudacao)
        
        # Não muda para IDENTIFICACAO ainda! Aguarda o cliente enviar algo.
        # Apenas atualiza o estado para aguardar a resposta do cliente
        cursor.execute("""
            UPDATE atendimentos
            SET estado_atual = 'AGUARDANDO_RESPOSTA'
            WHERE id = %s
        """, (atendimento_id,))
        conn.commit()
        return
    
    # Se está aguardando resposta, processa a mensagem
    elif estado_atual == 'AGUARDANDO_RESPOSTA':
        # Verifica se a mensagem parece ser um CPF
        cpf_cnpj = limpar_cpf_cnpj(mensagem_bruta)
        if len(cpf_cnpj) in (11, 14):
            cursor.execute("""
                UPDATE atendimentos
                SET cliente_cpf = %s, fluxo_atual = 'IDENTIFICACAO', estado_atual = 'PROCESSAR_DOCUMENTO', contexto_json = %s
                WHERE id = %s
            """, (cpf_cnpj, json.dumps({'cpf': cpf_cnpj}), atendimento_id))
            conn.commit()
            
            fluxo_identificacao = importlib.import_module('fluxo_identificacao')
            novo_atend = dict(atendimento)
            novo_atend['fluxo_atual'] = 'IDENTIFICACAO'
            novo_atend['estado_atual'] = 'PROCESSAR_DOCUMENTO'
            novo_atend['contexto_json'] = json.dumps({'cpf': cpf_cnpj})
            fluxo_identificacao.processar(conn, cursor, job, novo_atend, configs, mensagem_bruta)
        else:
            # Mensagem não é CPF, tenta classificar
            cursor.execute("""
                UPDATE atendimentos
                SET fluxo_atual = 'CLASSIFICACAO', estado_atual = 'AGUARDANDO_MENSAGEM'
                WHERE id = %s
            """, (atendimento_id,))
            conn.commit()
            
            fluxo_classificacao = importlib.import_module('fluxo_classificacao')
            fluxo_classificacao.processar(conn, cursor, job, atendimento, configs, mensagem_bruta)
    
    elif atendimento.get('fluxo_atual') != 'ROTEADOR':
        modulo_nome = f"fluxo_{atendimento['fluxo_atual'].lower()}"
        try:
            modulo = importlib.import_module(modulo_nome)
            modulo.processar(conn, cursor, job, atendimento, configs, mensagem_bruta)
        except ImportError:
            registrar_log('FLUXO_ROTEADOR', f"Módulo {modulo_nome} não encontrado")
            enviar_whatsapp(configs, numero, "Transferindo para um atendente.")
            cursor.execute("UPDATE atendimentos SET status = 'fila', fluxo_atual = 'HUMANO' WHERE id = %s", (atendimento_id,))
            conn.commit()
    
    registrar_log('FLUXO_ROTEADOR', "Processamento concluído")
