<?php
session_start();
require_once 'conexao.php';

// DEBUG: Log para verificar o que está chegando
error_log("=== TROCAR FUNIL CLIENTE ===");
error_log("POST RAW: " . file_get_contents('php://input'));
error_log("SESSION tenant_id: " . ($_SESSION['tenant_id'] ?? 'NULL'));

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

// Obter dados do POST como JSON
$input = file_get_contents('php://input');
$dados = json_decode($input, true);

error_log("Dados decodificados: " . print_r($dados, true));

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

// Verificar CSRF token - Tenta do header primeiro, depois do body
$csrf_token = $_SERVER['HTTP_X_CSRF_TOKEN'] ?? $dados['csrf_token'] ?? null;

if (!$csrf_token || empty($csrf_token)) {
    die(json_encode(['success' => false, 'message' => 'Token CSRF não enviado']));
}

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

if ($csrf_token !== $_SESSION['csrf_token']) {
    die(json_encode(['success' => false, 'message' => 'Token CSRF inválido']));
}

$cliente_id = $dados['cliente_id'] ?? null;
$novo_funil_id = $dados['novo_funil_id'] ?? null;
$funil_atual_id = $dados['funil_atual_id'] ?? null;
$tenant_id = $_SESSION['tenant_id'];
$usuario_id = $_SESSION['usuario_id'];
$nome_usuario = $_SESSION['nome_usuario'] ?? 'Usuário';

if (!$cliente_id || !$novo_funil_id) {
    echo json_encode(['success' => false, 'message' => 'Dados insuficientes']);
    exit;
}

try {
    $conn->begin_transaction();

    error_log("Iniciando transação para cliente $cliente_id, novo_funil_id: $novo_funil_id");

    // 1. Obter informações atuais do cliente
    $stmt_info = $conn->prepare("
        SELECT c.etapa_funil_id, c.funil_id,
               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");
    }

    $funil_anterior_nome = $cliente_info['funil_anterior_nome'] ?? 'Não definido';
    $etapa_anterior_nome = $cliente_info['etapa_anterior_nome'] ?? 'Não definida';
    $etapa_anterior_id = $cliente_info['etapa_funil_id'];
    $funil_anterior_id = $cliente_info['funil_anterior_id'];

    error_log("Cliente atual - etapa_funil_id: $etapa_anterior_id, funil_id: $funil_anterior_id");

    // 2. Obter informações do novo funil e sua primeira etapa
    $stmt_novo_funil = $conn->prepare("
        SELECT f.nome as novo_funil_nome,
               ef.id as primeira_etapa_id,
               ef.nome as primeira_etapa_nome
        FROM funis f
        LEFT JOIN etapas_funis ef ON f.id = ef.funil_id
        WHERE f.id = ? AND f.tenant_id = ?
        ORDER BY ef.ordem ASC
        LIMIT 1
    ");
    $stmt_novo_funil->bind_param("ii", $novo_funil_id, $tenant_id);
    $stmt_novo_funil->execute();
    $novo_funil_result = $stmt_novo_funil->get_result();
    
    if ($novo_funil_result->num_rows === 0) {
        throw new Exception("Novo funil não encontrado ou sem etapas");
    }
    
    $novo_funil_info = $novo_funil_result->fetch_assoc();
    $stmt_novo_funil->close();

    $novo_funil_nome = $novo_funil_info['novo_funil_nome'] ?? 'Não definido';
    $primeira_etapa_id = $novo_funil_info['primeira_etapa_id'];
    $primeira_etapa_nome = $novo_funil_info['primeira_etapa_nome'] ?? 'Primeira Etapa';

    error_log("Novo funil - primeira_etapa_id: $primeira_etapa_id, funil_id: $novo_funil_id");

    // 3. Atualizar o cliente para a primeira etapa do novo funil (ATUALIZAR AMBAS AS COLUNAS)
    $stmt_update = $conn->prepare("
        UPDATE clientes 
        SET etapa_funil_id = ?, funil_id = ? 
        WHERE id = ? AND tenant_id = ?
    ");
    $stmt_update->bind_param("iiii", $primeira_etapa_id, $novo_funil_id, $cliente_id, $tenant_id);
    
    if (!$stmt_update->execute()) {
        throw new Exception("Erro ao atualizar funil do cliente: " . $stmt_update->error);
    }
    $stmt_update->close();

    error_log("Cliente $cliente_id atualizado: etapa_funil_id=$primeira_etapa_id, funil_id=$novo_funil_id");

    // 4. Registrar no cliente_logs
    $acao = 'troca_funil';
    $detalhes = "Cliente movido do funil '{$funil_anterior_nome}' (etapa: {$etapa_anterior_nome}) para o funil '{$novo_funil_nome}' (etapa: {$primeira_etapa_nome})";
    
    $stmt_log = $conn->prepare("
        INSERT INTO cliente_logs 
        (cliente_id, usuario_id, nome_usuario, acao, detalhes, tenant_id, observacao_id, atividade_id) 
        VALUES (?, ?, ?, ?, ?, ?, 0, NULL)
    ");
    
    $stmt_log->bind_param("iissss", $cliente_id, $usuario_id, $nome_usuario, $acao, $detalhes, $tenant_id);
    
    if (!$stmt_log->execute()) {
        throw new Exception("Erro ao registrar log: " . $stmt_log->error);
    }
    $log_id = $conn->insert_id;
    $stmt_log->close();

    $conn->commit();

    // DEBUG: Verificar se os dados foram realmente atualizados
    $stmt_verify = $conn->prepare("SELECT etapa_funil_id, funil_id FROM clientes WHERE id = ?");
    $stmt_verify->bind_param("i", $cliente_id);
    $stmt_verify->execute();
    $result_verify = $stmt_verify->get_result();
    $cliente_verificado = $result_verify->fetch_assoc();
    $stmt_verify->close();

    error_log("Verificação pós-update - Cliente $cliente_id: etapa_funil_id=" . $cliente_verificado['etapa_funil_id'] . ", funil_id=" . $cliente_verificado['funil_id']);
    
    echo json_encode([
        'success' => true, 
        'message' => 'Funil alterado com sucesso',
        'log_id' => $log_id,
        'nova_etapa_id' => $primeira_etapa_id,
        'novo_funil_id' => $novo_funil_id,
        'detalhes' => $detalhes
    ]);

} catch (Exception $e) {
    $conn->rollback();
    error_log("Erro na troca de funil: " . $e->getMessage());
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}

$conn->close();
?>