<?php
// ====================================================
// INICIALIZAÇÃO ROBUSTA DE LOGS
// ====================================================

// Criar diretório de logs se não existir
$log_dir = __DIR__ . '/logs/';
if (!is_dir($log_dir)) {
    mkdir($log_dir, 0777, true);
}

// Configurar logging personalizado
function log_son($mensagem, $tipo = 'INFO') {
    global $log_dir;
    $timestamp = date('Y-m-d H:i:s');
    $log_file = $log_dir . 'son_integracao_' . date('Ymd') . '.log';
    
    $linha = sprintf("[%s] [%s] %s\n", $timestamp, $tipo, $mensagem);
    
    // Escreve no arquivo
    file_put_contents($log_file, $linha, FILE_APPEND);
    
    // Também escreve no error_log padrão
    error_log("[$tipo] $mensagem");
}

// Log inicial
log_son("==========================================", "DEBUG");
log_son("INICIANDO atualizar_status.php", "DEBUG");
log_son("Método: " . ($_SERVER['REQUEST_METHOD'] ?? 'N/A'), "DEBUG");

session_start();

// Verificar se usuário está logado
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    log_son("ERRO: Usuário não logado", "ERROR");
    die(json_encode(['success' => false, 'message' => 'Usuário não logado']));
}

log_son("Usuário logado: " . ($_SESSION['email_usuario'] ?? 'N/A'), "DEBUG");

// Obter dados do POST como JSON
$input = file_get_contents('php://input');
log_son("Dados recebidos (raw): " . substr($input, 0, 500), "DEBUG");

$dados = json_decode($input, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    log_son("ERRO: JSON inválido - " . json_last_error_msg(), "ERROR");
    die(json_encode(['success' => false, 'message' => 'Dados JSON inválidos']));
}

log_son("JSON decodificado com sucesso", "DEBUG");
log_son("Cliente ID: " . ($dados['id'] ?? 'N/A'), "DEBUG");
log_son("Nova Etapa ID: " . ($dados['etapa_id'] ?? 'N/A'), "DEBUG");
log_son("Tipo Movimento: " . ($dados['tipo_movimento'] ?? 'manual'), "DEBUG");

// Verificar CSRF token
if (!isset($dados['csrf_token']) || empty($dados['csrf_token'])) {
    log_son("ERRO: Token CSRF não enviado", "ERROR");
    die(json_encode(['success' => false, 'message' => 'Token CSRF não enviado']));
}

if (!isset($_SESSION['csrf_token']) || empty($_SESSION['csrf_token'])) {
    log_son("ERRO: Token CSRF da sessão não encontrado", "ERROR");
    die(json_encode(['success' => false, 'message' => 'Token CSRF da sessão não encontrado']));
}

if ($dados['csrf_token'] !== $_SESSION['csrf_token']) {
    log_son("ERRO: Token CSRF inválido", "ERROR");
    log_son("Recebido: " . $dados['csrf_token'], "DEBUG");
    log_son("Esperado: " . $_SESSION['csrf_token'], "DEBUG");
    die(json_encode(['success' => false, 'message' => 'Token CSRF inválido']));
}

log_son("CSRF token validado", "DEBUG");

$cliente_id = $dados['id'] ?? null;
$nova_etapa_id = $dados['etapa_id'] ?? null;
$tipo_movimento = $dados['tipo_movimento'] ?? 'manual';
$tenant_id = $_SESSION['tenant_id'];
$usuario_id = $_SESSION['usuario_id'];
$nome_usuario = $_SESSION['nome_usuario'] ?? 'Usuário';

log_son("Tenant ID: $tenant_id", "DEBUG");
log_son("Usuário ID: $usuario_id", "DEBUG");

if (!$cliente_id || !$nova_etapa_id) {
    log_son("ERRO: Dados insuficientes - cliente_id ou etapa_id faltando", "ERROR");
    echo json_encode(['success' => false, 'message' => 'Dados insuficientes']);
    exit;
}

require_once 'conexao.php';

try {
    log_son("Iniciando transação do banco de dados", "DEBUG");
    $conn->begin_transaction();

    // 1. Obter informações atuais do cliente
    $stmt_info = $conn->prepare("
        SELECT c.etapa_funil_id as etapa_anterior, 
               c.Nome_Cliente as cliente_nome,
               c.Email as cliente_email,
               c.responsavel,
               f.nome as funil_anterior_nome,
               ef.nome as etapa_anterior_nome,
               f.id as funil_anterior_id
        FROM clientes c
        LEFT JOIN etapas_funis ef ON c.etapa_funil_id = ef.id
        LEFT JOIN funis f ON ef.funil_id = f.id
        WHERE c.id = ? AND c.tenant_id = ?
    ");
    $stmt_info->bind_param("ii", $cliente_id, $tenant_id);
    $stmt_info->execute();
    $cliente_info = $stmt_info->get_result()->fetch_assoc();
    $stmt_info->close();

    if (!$cliente_info) {
        throw new Exception("Cliente não encontrado");
    }

    $etapa_anterior_id = $cliente_info['etapa_anterior'];
    $cliente_nome = $cliente_info['cliente_nome'];
    $cliente_email = $cliente_info['cliente_email'];
    $responsavel_id = $cliente_info['responsavel'];
    $funil_anterior_nome = $cliente_info['funil_anterior_nome'] ?? 'Não definido';
    $etapa_anterior_nome = $cliente_info['etapa_anterior_nome'] ?? 'Não definida';
    $funil_anterior_id = $cliente_info['funil_anterior_id'];

    log_son("Cliente encontrado: $cliente_nome ($cliente_email)", "DEBUG");
    log_son("Etapa anterior: $etapa_anterior_nome (ID: $etapa_anterior_id)", "DEBUG");
    log_son("Funil anterior: $funil_anterior_nome (ID: $funil_anterior_id)", "DEBUG");

    // 2. Obter informações da nova etapa
    $stmt_nova_etapa = $conn->prepare("
        SELECT ef.nome as nova_etapa_nome, 
               f.nome as novo_funil_nome, 
               f.id as novo_funil_id,
               ef.tipo_entrada
        FROM etapas_funis ef
        LEFT JOIN funis f ON ef.funil_id = f.id
        WHERE ef.id = ? AND f.tenant_id = ?
    ");
    $stmt_nova_etapa->bind_param("ii", $nova_etapa_id, $tenant_id);
    $stmt_nova_etapa->execute();
    $nova_etapa_result = $stmt_nova_etapa->get_result();
    
    if ($nova_etapa_result->num_rows === 0) {
        throw new Exception("Etapa não encontrada ou não pertence ao seu tenant");
    }
    
    $nova_etapa_info = $nova_etapa_result->fetch_assoc();
    $stmt_nova_etapa->close();

    $nova_etapa_nome = $nova_etapa_info['nova_etapa_nome'] ?? 'Não definida';
    $novo_funil_nome = $nova_etapa_info['novo_funil_nome'] ?? 'Não definido';
    $novo_funil_id = $nova_etapa_info['novo_funil_id'];
    $tipo_entrada_etapa = $nova_etapa_info['tipo_entrada'] ?? 'manual';

    log_son("Nova etapa: $nova_etapa_nome (ID: $nova_etapa_id)", "DEBUG");
    log_son("Novo funil: $novo_funil_nome (ID: $novo_funil_id)", "DEBUG");
    log_son("Tipo entrada etapa: $tipo_entrada_etapa", "DEBUG");

    // 3. Atualizar a etapa do cliente
    $stmt_update = $conn->prepare("UPDATE clientes SET etapa_funil_id = ? WHERE id = ? AND tenant_id = ?");
    $stmt_update->bind_param("iii", $nova_etapa_id, $cliente_id, $tenant_id);
    
    if (!$stmt_update->execute()) {
        throw new Exception("Erro ao atualizar etapa do cliente: " . $stmt_update->error);
    }
    
    $rows_affected = $stmt_update->affected_rows;
    $stmt_update->close();

    if ($rows_affected === 0) {
        throw new Exception("Nenhum cliente foi atualizado - verifique se o cliente existe e pertence ao seu tenant");
    }

    log_son("✅ Cliente atualizado com sucesso (affected_rows: $rows_affected)", "SUCCESS");

    // 4. Criar uma observação para o log
    $tipo_movimento_texto = $tipo_movimento === 'agendamento' ? 'via agendamento' : 'manual';
    $observacao_texto = "Cliente movido de '{$etapa_anterior_nome}' para '{$nova_etapa_nome}' no funil '{$novo_funil_nome}' ({$tipo_movimento_texto})";
    
    $stmt_observacao = $conn->prepare("
        INSERT INTO cliente_observacoes 
        (cliente_id, usuario_id, observacao, data_cadastro) 
        VALUES (?, ?, ?, NOW())
    ");
    $stmt_observacao->bind_param("iis", $cliente_id, $usuario_id, $observacao_texto);
    
    if (!$stmt_observacao->execute()) {
        throw new Exception("Erro ao criar observação: " . $stmt_observacao->error);
    }
    $observacao_id = $conn->insert_id;
    $stmt_observacao->close();

    log_son("Observação criada com ID: $observacao_id", "DEBUG");

    // 5. Registrar no cliente_logs com observacao_id válido
    $acao = 'movimentacao_etapa';
    $detalhes = "Cliente '{$cliente_nome}' movido de '{$etapa_anterior_nome}' para '{$nova_etapa_nome}' no funil '{$novo_funil_nome}' ({$tipo_movimento_texto})";
    
    $stmt_log = $conn->prepare("
        INSERT INTO cliente_logs 
        (cliente_id, usuario_id, nome_usuario, acao, detalhes, tenant_id, observacao_id, atividade_id) 
        VALUES (?, ?, ?, ?, ?, ?, ?, NULL)
    ");
    
    $stmt_log->bind_param("iisssii", $cliente_id, $usuario_id, $nome_usuario, $acao, $detalhes, $tenant_id, $observacao_id);
    
    if (!$stmt_log->execute()) {
        throw new Exception("Erro ao registrar log: " . $stmt_log->error);
    }
    $log_id = $conn->insert_id;
    $stmt_log->close();

    log_son("Log registrado com ID: $log_id", "DEBUG");

    // 6. VERIFICAR FLUXOS AUTOMATIZADOS APÓS MUDANÇA DE ETAPA
    $atividades_criadas = 0;
    $fluxos_acionados = [];
    $atividade_criada_info = null;
    
    if (file_exists('verificador_fluxos_automatizados.php')) {
        require_once 'verificador_fluxos_automatizados.php';
        
        // Verificar se a função existe
        if (!function_exists('criarAtividadesPorFluxo')) {
            log_son("AVISO: Função criarAtividadesPorFluxo não encontrada no verificador", "WARNING");
        } else {
            // Dados completos do cliente para o verificador
            $dados_cliente = [
                'etapa_funil_id' => $nova_etapa_id,
                'etapa_anterior_id' => $etapa_anterior_id,
                'funil_id' => $novo_funil_id,
                'tenant_id' => $tenant_id,
                'cliente_id' => $cliente_id,
                'cliente_nome' => $cliente_nome,
                'cliente_email' => $cliente_email,
                'responsavel_id' => $responsavel_id,
                'movimentado_por' => $usuario_id,
                'tipo_movimento' => $tipo_movimento,
                'tipo_entrada_etapa' => $tipo_entrada_etapa
            ];
            
            // Executar verificação de fluxos para mudança de etapa
            $atividades_criadas = criarAtividadesPorFluxo(
                $conn, 
                'cliente_etapa_alterada',
                $cliente_id,
                $dados_cliente
            );
            
            log_son("Fluxos automatizados verificados: $atividades_criadas atividades criadas", "INFO");
            
            // Buscar informações da última atividade criada para retornar ao JavaScript
            if ($atividades_criadas > 0) {
                $stmt_ultima_atividade = $conn->prepare("
                    SELECT a.id, a.nome, a.descricao, a.data_agendada, 
                           a.concluida, a.data_conclusao, a.notificar, 
                           a.data_notificacao
                    FROM atividades a
                    WHERE a.cliente_id = ? 
                    AND a.tenant_id = ?
                    ORDER BY a.id DESC 
                    LIMIT 1
                ");
                $stmt_ultima_atividade->bind_param("ii", $cliente_id, $tenant_id);
                $stmt_ultima_atividade->execute();
                $result_ultima_atividade = $stmt_ultima_atividade->get_result();
                
                if ($atividade = $result_ultima_atividade->fetch_assoc()) {
                    $atividade_criada_info = [
                        'id' => $atividade['id'],
                        'nome' => $atividade['nome'],
                        'descricao' => $atividade['descricao'],
                        'data_agendada' => $atividade['data_agendada'],
                        'concluida' => $atividade['concluida'],
                        'data_conclusao' => $atividade['data_conclusao'],
                        'notificar' => $atividade['notificar'],
                        'data_notificacao' => $atividade['data_notificacao']
                    ];
                    log_son("Atividade criada: " . $atividade['nome'] . " (ID: " . $atividade['id'] . ")", "SUCCESS");
                }
                $stmt_ultima_atividade->close();
                
                // Buscar informações sobre os fluxos acionados para o log
                $stmt_fluxos = $conn->prepare("
                    SELECT id, nome FROM fluxos_automatizados 
                    WHERE tenant_id = ? AND ativo = 1 
                    AND JSON_CONTAINS(condicoes, JSON_OBJECT('tipo', 'etapa_funil'))
                    AND JSON_EXTRACT(condicoes, '$[0].etapa_funil_id') = ?
                ");
                $stmt_fluxos->bind_param("ii", $tenant_id, $nova_etapa_id);
                $stmt_fluxos->execute();
                $result_fluxos = $stmt_fluxos->get_result();
                
                while ($fluxo = $result_fluxos->fetch_assoc()) {
                    $fluxos_acionados[] = $fluxo['nome'];
                }
                $stmt_fluxos->close();
            }
        }
    } else {
        log_son("AVISO: Arquivo verificador_fluxos_automatizados.php não encontrado", "WARNING");
    }

    // ====================================================
    // 7. INTEGRAÇÃO RD MARKETING - ENVIO AUTOMÁTICO
    // ====================================================
    log_son("==========================================", "DEBUG");
    log_son("INICIANDO INTEGRAÇÃO RD MARKETING", "DEBUG");
    log_son("==========================================", "DEBUG");
    
    try {
        // Caminho para o arquivo de integração
        $arquivo_integracao = __DIR__ . '/../integracao_legada/enviar_para_externo.php';
        log_son("Procurando arquivo: $arquivo_integracao", "DEBUG");
        
        if (file_exists($arquivo_integracao)) {
            log_son("✅ Arquivo de integração encontrado", "SUCCESS");
            include_once $arquivo_integracao;
            
            // Verificar se a função existe
            if (function_exists('executarEnvioLead')) {
                log_son("✅ Função 'executarEnvioLead' encontrada", "SUCCESS");
                
                // Buscar configuração RD Marketing para esta etapa
                log_son("Buscando configuração RD para etapa ID: $nova_etapa_id", "DEBUG");
                
                $sql_rd = "SELECT cr.id, cr.sistema_externo, cr.direcao, cr.webhook_status, 
                                  cr.url_externo, cr.api_token, cr.metodo_autenticacao,
                                  cr.headers_json
                          FROM config_redirecionamentos cr
                          WHERE cr.etapa_id = ? 
                          AND cr.tenant_id = ?
                          AND cr.sistema_externo = 'rd_marketing'
                          AND (cr.direcao = 'saida' OR cr.direcao = 'ambos')
                          AND cr.webhook_status = 'ativo'
                          LIMIT 1";
                
                $stmt_rd = $conn->prepare($sql_rd);
                $stmt_rd->bind_param("ii", $nova_etapa_id, $tenant_id);
                $stmt_rd->execute();
                $result_rd = $stmt_rd->get_result();
                $num_rows = $result_rd->num_rows;
                
                log_son("Configurações RD encontradas: $num_rows", "DEBUG");
                
                if ($num_rows > 0) {
                    $config = $result_rd->fetch_assoc();
                    $config_id = $config['id'];
                    
                    log_son("✅ CONFIGURAÇÃO RD ENCONTRADA:", "SUCCESS");
                    log_son("   ID: $config_id", "DEBUG");
                    log_son("   Sistema: " . $config['sistema_externo'], "DEBUG");
                    log_son("   Direção: " . $config['direcao'], "DEBUG");
                    log_son("   URL: " . $config['url_externo'], "DEBUG");
                    log_son("   Token existe: " . (!empty($config['api_token']) ? 'SIM' : 'NÃO'), "DEBUG");
                    
                    // Chamar função de envio
                    log_son("Executando: executarEnvioLead($cliente_id, $config_id)", "DEBUG");
                    
                    $resultado_envio = executarEnvioLead($cliente_id, $config_id);
                    
                    log_son("RESULTADO DO ENVIO RD:", "INFO");
                    log_son(json_encode($resultado_envio), "DEBUG");
                    
                    if (isset($resultado_envio['sucesso']) && $resultado_envio['sucesso']) {
                        log_son("✅✅✅ LEAD ENVIADO PARA RD MARKETING COM SUCESSO!", "SUCCESS");
                        log_son("HTTP Code: " . ($resultado_envio['http_code'] ?? 'N/A'), "DEBUG");
                    } else {
                        log_son("❌ FALHA NO ENVIO PARA RD MARKETING", "ERROR");
                        log_son("Erro: " . ($resultado_envio['erro'] ?? 'Desconhecido'), "ERROR");
                        log_son("HTTP Code: " . ($resultado_envio['http_code'] ?? 'N/A'), "DEBUG");
                    }
                } else {
                    log_son("ℹ️ Nenhuma configuração RD encontrada para esta etapa", "INFO");
                    log_son("Critérios da busca:", "DEBUG");
                    log_son("  - Etapa ID: $nova_etapa_id", "DEBUG");
                    log_son("  - Tenant ID: $tenant_id", "DEBUG");
                    log_son("  - Sistema: rd_marketing", "DEBUG");
                    log_son("  - Direção: saida ou ambos", "DEBUG");
                    log_son("  - Status: ativo", "DEBUG");
                }
                
                $stmt_rd->close();
            } else {
                log_son("❌ Função 'executarEnvioLead' NÃO encontrada no arquivo", "ERROR");
            }
        } else {
            log_son("❌ ARQUIVO DE INTEGRAÇÃO NÃO ENCONTRADO", "ERROR");
            log_son("Caminho testado: $arquivo_integracao", "DEBUG");
        }
    } catch (Exception $e) {
        log_son("❌ ERRO na integração RD Marketing: " . $e->getMessage(), "ERROR");
        log_son("Arquivo: " . $e->getFile(), "DEBUG");
        log_son("Linha: " . $e->getLine(), "DEBUG");
        // Não interrompe o fluxo principal
    }
    
    log_son("==========================================", "DEBUG");
    log_son("FIM DA INTEGRAÇÃO RD MARKETING", "DEBUG");
    log_son("==========================================", "DEBUG");

    $conn->commit();
    log_son("✅ Transação do banco concluída com sucesso", "SUCCESS");

    // 8. Resposta com informações completas
    $response = [
        'success' => true, 
        'message' => 'Etapa atualizada com sucesso',
        'log_id' => $log_id,
        'observacao_id' => $observacao_id,
        'atividades_criadas' => $atividades_criadas,
        'tipo_movimento' => $tipo_movimento,
        'atividade_criada' => $atividade_criada_info,
        'detalhes' => [
            'cliente' => $cliente_nome,
            'etapa_anterior' => $etapa_anterior_nome,
            'etapa_nova' => $nova_etapa_nome,
            'funil' => $novo_funil_nome,
            'tipo_movimento' => $tipo_movimento,
            'tipo_entrada_etapa' => $tipo_entrada_etapa
        ]
    ];
    
    // Adicionar informações de fluxos se houver
    if (!empty($fluxos_acionados)) {
        $response['fluxos_acionados'] = $fluxos_acionados;
        $response['message'] .= ' e ' . $atividades_criadas . ' atividade(s) automatizada(s) criada(s)';
    }
    
    log_son("Enviando resposta: " . json_encode($response), "DEBUG");
    
    echo json_encode($response);

} catch (Exception $e) {
    if (isset($conn)) {
        $conn->rollback();
        log_son("❌ Rollback da transação executado", "ERROR");
    }
    
    log_son("❌❌❌ EXCEÇÃO GERAL: " . $e->getMessage(), "ERROR");
    log_son("Arquivo: " . $e->getFile(), "DEBUG");
    log_son("Linha: " . $e->getLine(), "DEBUG");
    
    echo json_encode([
        'success' => false, 
        'message' => $e->getMessage(),
        'atividades_criadas' => 0,
        'atividade_criada' => null
    ]);
}

// Fechar conexão
if (isset($conn) && $conn->ping()) {
    $conn->close();
}

log_son("==========================================", "DEBUG");
log_son("FINALIZANDO atualizar_status.php", "DEBUG");
log_son("==========================================", "DEBUG");
?>