<?php
// Versão do Backend PHP - FINAL E COMPLETA (Com todas as Ações Migradas e Corrigidas)

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json; charset=UTF-8");

// --- DADOS DE CONEXÃO COM O BANCO DE DADOS ---
$db_host = "localhost";
$db_name = "vini_vfsystem";
$db_user = "vini_vfuser";
$db_pass = "5@;NwUBzhhRc"; // Lembre-se de usar a senha correta

// --- FUNÇÃO AUXILIAR ---
function getData($conn, $sql) {
    $stmt = $conn->prepare($sql);
    if ($stmt === false) { throw new Exception("Erro na preparação da query: " . $conn->error); }
    $stmt->execute();
    $result = $stmt->get_result();
    $data = [];
    while ($row = $result->fetch_assoc()) { $data[] = $row; }
    $stmt->close();
    return ['status' => 'success', 'data' => $data];
}

// --- CONEXÃO ---
try {
    $conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
    if ($conn->connect_error) { throw new Exception("Erro de Conexão: " . $conn->connect_error); }
    $conn->query("SET time_zone = '-03:00'");
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => 'Erro interno no servidor.']);
    exit();
}

$action = isset($_POST['action']) ? $_POST['action'] : (isset($_GET['action']) ? $_GET['action'] : '');
$response = [];

try {
    switch ($action) {
        
        // --- AÇÕES DE LEITURA (GET) ---
        case 'USER_LOGIN':
            $loginIdentifier = $_POST['email'] ?? '';
            $password = $_POST['password'] ?? '';
            $stmt = $conn->prepare("SELECT id, nome AS name, email, senha, funcao AS role, primeiro_login FROM usuarios WHERE email = ? OR nome = ?");
            $stmt->bind_param("ss", $loginIdentifier, $loginIdentifier);
            $stmt->execute();
            $result = $stmt->get_result();
            if ($result->num_rows === 1) {
                $user = $result->fetch_assoc();
                if (password_verify($password, $user['senha'])) {
            // A senha está correta!
            unset($user['senha']);
            $response = ['status' => 'success', 'user' => $user];
        } else {
            // Senha incorreta
            $response = ['status' => 'error', 'message' => 'Login ou senha inválidos.'];
        }
            } else { $response = ['status' => 'error', 'message' => 'Login ou senha inválidos.']; }
            $stmt->close();
            break;
        case 'GET_USERS':
    // Esta linha esconde o Desenvolvedor da lista para outros usuários.
            $sql = "SELECT id, nome AS name, email, funcao AS role FROM usuarios WHERE funcao != 'Desenvolvedor' ORDER BY nome ASC";
            $response = getData($conn, $sql);
            break;
        case 'GET_PRODUCTS_INFO': $response = getData($conn, "SELECT id, nome, safetyStock FROM produtos ORDER BY nome ASC"); break;
        case 'GET_INVENTORY': $response = getData($conn, "SELECT produto_id as id, produto, endereco, patrimonio FROM inventario_principal ORDER BY produto ASC"); break;
        case 'GET_ALL_VEHICLE_INVENTORIES':
            $vehicle_tables = ['montana' => 'inventario_veiculos_montana', 'uno' => 'inventario_veiculos_uno', 'pajero' => 'inventario_veiculos_pajero', 'estoqueAlternativo' => 'inventario_veiculos_estoquealternativo'];
            $all_inventories = [];
            foreach($vehicle_tables as $key => $table_name) {
                if ($conn->query("SHOW TABLES LIKE '{$table_name}'")->num_rows > 0) {
                    $sql = "SELECT produto_id as id, produto, endereco, patrimonio FROM `{$table_name}` ORDER BY produto ASC";
                    $dataResult = getData($conn, $sql);
                    $all_inventories[$key] = $dataResult['data'];
                } else { $all_inventories[$key] = []; }
            }
            $response = ['status' => 'success', 'data' => $all_inventories];
            break;
        case 'GET_REDIRECT_INVENTORY': $response = getData($conn, "SELECT produto_id as id, produto, patrimonio, removedFrom FROM redirecionamento ORDER BY id ASC"); break;
        case 'GET_RECTIFICATION_ITEMS': $response = getData($conn, "SELECT produto_id as id, produto, patrimonio, removedFrom FROM materiais_retifica ORDER BY id ASC"); break;
        case 'GET_CLIENT_ACTIVITIES': 
            $sql = "SELECT clientId, clientName, userName, patrimonio, reason, DATE_FORMAT(date, '%Y-%m-%dT%H:%i:%S') AS date, tower, sector FROM atividades_cliente ORDER BY date DESC";
            $response = getData($conn, $sql); 
            break;
        case 'GET_CLIENTS': $response = getData($conn, "SELECT id, name, tower, sector FROM clientes ORDER BY name ASC"); break;
        case 'GET_TRANSACTION_LOGS': $response = getData($conn, "SELECT timestamp, user, action, patrimonio, source, destination FROM logs_transacoes ORDER BY timestamp DESC"); break;
        
        // ... logo após o 'break;' do case 'GET_TRANSACTION_LOGS'

        // Substitua o seu case 'GET_TOWERS' por esta versão
case 'GET_TOWERS':
    try {
        $torres_sql = "SELECT id, nome FROM torres ORDER BY nome ASC";
        $torres_result = $conn->query($torres_sql);
        $torres = $torres_result->fetch_all(MYSQLI_ASSOC);

        // AGORA BUSCA O LIMITE JUNTO COM O NOME DO SETOR
        $setores_sql = "SELECT id as setor_id, torre_id, nome_setor, limite_clientes FROM setores";
        $setores_result = $conn->query($setores_sql);
        $todos_os_setores = $setores_result->fetch_all(MYSQLI_ASSOC);

        $itens_sql = "SELECT ia.torre_id, ia.patrimonio, p.nome as nomeProduto FROM itens_alocados ia JOIN produtos p ON ia.produto_id = p.id";
        $itens_result = $conn->query($itens_sql);
        $todos_os_itens = $itens_result->fetch_all(MYSQLI_ASSOC);

        $clientes_sql = "SELECT tower, sector, COUNT(*) as client_count FROM clientes WHERE tower IS NOT NULL AND sector IS NOT NULL AND tower != '' AND sector != '' GROUP BY tower, sector";
        $clientes_result = $conn->query($clientes_sql);
        $contagem_clientes = [];
        while($row = $clientes_result->fetch_assoc()) {
            $contagem_clientes[$row['tower']][$row['sector']] = $row['client_count'];
        }

        foreach ($torres as $key => $torre) {
            $torre_id = $torre['id'];
            $torre_nome = $torre['nome'];

            $setores_da_torre = array_filter($todos_os_setores, function($setor) use ($torre_id) { return $setor['torre_id'] == $torre_id; });

            $setores_formatados = [];
            foreach($setores_da_torre as $setor) {
                $nome_setor = $setor['nome_setor'];
                $count = $contagem_clientes[$torre_nome][$nome_setor] ?? 0;
                // AGORA O OBJETO DO SETOR CONTÉM SEU PRÓPRIO ID E LIMITE
                $setores_formatados[] = ['id' => $setor['setor_id'], 'nome' => $nome_setor, 'clientes' => $count, 'limite' => (int)$setor['limite_clientes']];
            }
            $torres[$key]['setores'] = $setores_formatados;

            $itens_da_torre = array_filter($todos_os_itens, function($item) use ($torre_id) { return $item['torre_id'] == $torre_id; });
            $torres[$key]['itens'] = array_values($itens_da_torre);
        }

        $response = ['status' => 'success', 'data' => $torres];

    } catch (Exception $e) {
        http_response_code(500);
        $response = ['status' => 'error', 'message' => 'Erro no servidor ao buscar dados das torres: ' . $e->getMessage()];
    }
    break;
case 'UPDATE_SECTOR_LIMIT':
    $setorId = (int)($_POST['setorId'] ?? 0);
    $novoLimite = (int)($_POST['limite'] ?? 0);

    if ($setorId <= 0 || $novoLimite <= 0) {
        $response = ['status' => 'error', 'message' => 'Dados inválidos para atualizar o limite.'];
        break;
    }

    $stmt = $conn->prepare("UPDATE setores SET limite_clientes = ? WHERE id = ?");
    $stmt->bind_param("ii", $novoLimite, $setorId);

    if ($stmt->execute()) {
        if ($stmt->affected_rows > 0) {
            $response = ['status' => 'success', 'message' => 'Limite do setor atualizado com sucesso!'];
        } else {
            $response = ['status' => 'error', 'message' => 'Setor não encontrado ou o limite já era o mesmo.'];
        }
    } else {
        $response = ['status' => 'error', 'message' => 'Erro ao atualizar o limite: ' . $stmt->error];
    }
    $stmt->close();
    break;

    // Adicione este novo case no seu switch ($action)
case 'GET_SECTOR_CLIENT_COUNTS':
    $sql = "SELECT tower, sector, COUNT(*) as client_count 
            FROM clientes 
            WHERE tower IS NOT NULL AND tower != '' AND sector IS NOT NULL AND sector != ''
            GROUP BY tower, sector";
    
    $result = $conn->query($sql);
    $counts = [];
    while($row = $result->fetch_assoc()) {
        // Cria um mapa para acesso fácil, ex: $counts['TORRE A']['SETOR 1'] = 10
        $counts[$row['tower']][$row['sector']] = $row['client_count'];
    }
    $response = ['status' => 'success', 'data' => $counts];
    break;


    case 'GET_CONFIGURACAO':
    $chave = $_POST['chave'] ?? '';
    if (empty($chave)) {
        $response = ['status' => 'error', 'message' => 'Chave de configuração não fornecida.'];
        break;
    }
    $stmt = $conn->prepare("SELECT valor FROM configuracoes WHERE chave = ?");
    $stmt->bind_param("s", $chave);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($row = $result->fetch_assoc()) {
        $response = ['status' => 'success', 'data' => $row];
    } else {
        $response = ['status' => 'success', 'data' => null]; // Retorna nulo se a chave não existir
    }
    $stmt->close();
    break;

case 'UPDATE_CONFIGURACAO':
    $chave = $_POST['chave'] ?? '';
    $valor = $_POST['valor'] ?? '';
    if (empty($chave)) {
        $response = ['status' => 'error', 'message' => 'Chave de configuração não fornecida.'];
        break;
    }
    // Usa REPLACE INTO que funciona como INSERT se a chave não existe, ou UPDATE se já existe.
    $stmt = $conn->prepare("REPLACE INTO configuracoes (chave, valor) VALUES (?, ?)");
    $stmt->bind_param("ss", $chave, $valor);
    if ($stmt->execute()) {
        $response = ['status' => 'success', 'message' => 'Configuração salva com sucesso!'];
    } else {
        $response = ['status' => 'error', 'message' => 'Erro ao salvar configuração: ' . $stmt->error];
    }
    $stmt->close();
    break;

// Adicione este novo case no seu switch ($action)
$setorId = (int)($_POST['setorId'] ?? 0);
    $novoLimite = (int)($_POST['limite'] ?? 0);

    if ($setorId <= 0 || $novoLimite <= 0) {
        $response = ['status' => 'error', 'message' => 'Dados inválidos para atualizar o limite.'];
        break;
    }

    $stmt = $conn->prepare("UPDATE setores SET limite_clientes = ? WHERE id = ?");
    $stmt->bind_param("ii", $novoLimite, $setorId);

    if ($stmt->execute()) {
        if ($stmt->affected_rows > 0) {
            $response = ['status' => 'success', 'message' => 'Limite do setor atualizado com sucesso!'];
        } else {
            $response = ['status' => 'error', 'message' => 'Setor não encontrado ou o limite já era o mesmo.'];
        }
    } else {
        $response = ['status' => 'error', 'message' => 'Erro ao atualizar o limite: ' . $stmt->error];
    }
    $stmt->close();
    break;


        // O próximo case ('ADD_INVENTORY_ITEM') começa aqui...
        // --- AÇÕES DE ESCRITA E MOVIMENTAÇÃO ---
        case 'ADD_INVENTORY_ITEM':
    $patrimonio = $_POST['patrimonio'] ?? '';
    $mac_address = $_POST['mac_address'] ?? null; // Pega o MAC, pode ser nulo

    // Verifica se o patrimônio já existe
    $check_stmt = $conn->prepare("SELECT id FROM inventario_principal WHERE patrimonio = ?");
    $check_stmt->bind_param("s", $patrimonio);
    $check_stmt->execute();
    if ($check_stmt->get_result()->num_rows > 0) {
        $response = ['status' => 'error', 'message' => "Patrimônio '{$patrimonio}' já existe."];
        $check_stmt->close();
        break;
    }
    $check_stmt->close();

    // Query de inserção ATUALIZADA
    $stmt = $conn->prepare("INSERT INTO inventario_principal (produto_id, produto, endereco, patrimonio, mac_address) VALUES (?, ?, ?, ?, ?)");
    // Tipos de bind ATUALIZADOS para "sssss"
    $stmt->bind_param("sssss", $_POST['id'], $_POST['produto_nome'], $_POST['endereco'], $patrimonio, $mac_address);
    
    if ($stmt->execute()) { 
        $response = ['status' => 'success', 'message' => "Item '{$patrimonio}' cadastrado!"]; 
    } else { 
        $response = ['status' => 'error', 'message' => 'Erro: ' . $stmt->error]; 
    }
    $stmt->close();
    break;
        case 'ADD_PRODUCT_DEFINITION':
            $stmt = $conn->prepare("INSERT INTO produtos (id, nome, safetyStock) VALUES (?, ?, ?)");
            $stmt->bind_param("ssi", $_POST['id'], $_POST['name'], $_POST['safetyStock']);
            if ($stmt->execute()) { $response = ['status' => 'success', 'message' => 'Definição de produto adicionada.']; } 
            else { $response = ['status' => 'error', 'message' => 'Erro: ' . $stmt->error]; }
            $stmt->close();
            break;
        case 'ADD_USER':
    $hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);

    // 1. A query agora inclui a coluna 'primeiro_login'
    $stmt = $conn->prepare("INSERT INTO usuarios (nome, email, senha, funcao, primeiro_login) VALUES (?, ?, ?, ?, ?)");

    $first_login_flag = 1; // 2. Definimos a flag de primeiro login como 1 (verdadeiro)

    // 3. Atualizamos os tipos ("ssssi") e adicionamos a nova variável ao bind
    $stmt->bind_param("ssssi", $_POST['name'], $_POST['email'], $hashed_password, $_POST['role'], $first_login_flag);

    if ($stmt->execute()) { 
        $response = ['status' => 'success', 'message' => "Usuário cadastrado!"]; 
    } else { 
        if ($conn->errno == 1062) { 
            $response = ['status' => 'error', 'message' => "Erro: O e-mail já está cadastrado."]; 
        } else { 
            $response = ['status' => 'error', 'message' => 'Erro: ' . $stmt->error]; 
        } 
    }
    $stmt->close();
    break;
        case 'ADD_CLIENT':
            $stmt = $conn->prepare("INSERT INTO clientes (name, tower, sector) VALUES (?, ?, ?)");
            $stmt->bind_param("sss", $_POST['name'], $_POST['tower'], $_POST['sector']);
            if ($stmt->execute()) { $response = ['status' => 'success', 'message' => "Cliente cadastrado!"]; } 
            else { $response = ['status' => 'error', 'message' => 'Erro: ' . $stmt->error]; }
            $stmt->close();
            break;
        case 'ADD_ITEM_TO_VEHICLE':
    $patrimonio = $_POST['patrimonio'] ?? '';
    $vehicleName = strtolower($_POST['vehicleName'] ?? '');
    // Agora busca o MAC junto com os outros dados
    $stmt_find = $conn->prepare("SELECT produto_id, produto, endereco, patrimonio, mac_address FROM inventario_principal WHERE patrimonio = ?");
    $stmt_find->bind_param("s", $patrimonio);
    $stmt_find->execute();
    $result_find = $stmt_find->get_result();
    if ($result_find->num_rows === 1) {
        $item_data = $result_find->fetch_assoc();
        $stmt_find->close();
        $vehicle_table_suffix = str_replace(' ', '', strtolower($vehicleName));
        $vehicle_table = 'inventario_veiculos_' . $vehicle_table_suffix;
        // Agora insere o MAC junto com os outros dados
        $stmt_insert = $conn->prepare("INSERT INTO `{$vehicle_table}` (produto_id, produto, endereco, patrimonio, mac_address) VALUES (?, ?, ?, ?, ?)");
        $stmt_insert->bind_param("sssss", $item_data['produto_id'], $item_data['produto'], $item_data['endereco'], $item_data['patrimonio'], $item_data['mac_address']);
        if ($stmt_insert->execute()) {
            $stmt_insert->close();
            $stmt_delete = $conn->prepare("DELETE FROM inventario_principal WHERE patrimonio = ?");
            $stmt_delete->bind_param("s", $patrimonio);
            $stmt_delete->execute();
            $stmt_delete->close();
            $response = ['status' => 'success', 'message' => "Item adicionado ao veículo."];
        } else { $response = ['status' => 'error', 'message' => 'Erro ao adicionar ao veículo: ' . $stmt_insert->error]; }
    } else { $response = ['status' => 'error', 'message' => "Item {$patrimonio} não encontrado no estoque principal."]; }
    break;

            // Adicione este novo case no seu index.php
    case 'GET_PENDING_FINANCIAL':
    // 1. Pega todas as atividades com status 'Pendente'.
    $sql_activities = "SELECT id, clientId, clientName, reason, patrimonio, metragem_cabo, date 
                       FROM atividades_cliente 
                       WHERE status_financeiro = 'Pendente' 
                       ORDER BY date DESC";
    
    $activities_result = $conn->query($sql_activities);
    $pending_activities = $activities_result->fetch_all(MYSQLI_ASSOC);

    // 2. Cria um mapa de consulta de todos os patrimônios (VERSÃO CORRIGIDA E COMPLETA)
    $patrimonio_map_sql = "
        SELECT patrimonio, produto, mac_address FROM inventario_principal
        UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_montana
        UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_uno
        UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_pajero
        UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_estoquealternativo
        UNION ALL SELECT patrimonio, produto, mac_address FROM redirecionamento
        UNION ALL SELECT patrimonio, produto, mac_address FROM materiais_retifica
    ";
    $patrimonio_map_result = $conn->query($patrimonio_map_sql);
    $patrimonio_map = [];
    while ($row = $patrimonio_map_result->fetch_assoc()) {
        $patrimonio_map[trim($row['patrimonio'])] = ['produto' => $row['produto'], 'mac_address' => $row['mac_address']];
    }

    $billable_activities = [];
    $reasons_to_bill = ['Instalacao', 'Troca de endereco', 'Venda', 'Retirada'];

    // 3. Loop para filtrar e formatar os detalhes de cada atividade.
    foreach ($pending_activities as $activity) {
        $details = [];
        $is_billable = false;

        // Condição 1: O motivo já é uma cobrança direta.
        if (in_array($activity['reason'], $reasons_to_bill)) {
            $is_billable = true;
        }

        // Condição 2: Foi utilizado cabo.
        if (!empty($activity['metragem_cabo']) && floatval($activity['metragem_cabo']) > 0) {
            $details[] = "Cabo - " . $activity['metragem_cabo'] . " metros";
            $is_billable = true;
        }

        // Condição 3: Verifica os patrimônios para encontrar Roteadores.
        if (!empty($activity['patrimonio'])) {
            $patrimonios = explode(',', $activity['patrimonio']);
            foreach ($patrimonios as $p_num) {
                $p_num_trimmed = trim($p_num);
                if (isset($patrimonio_map[$p_num_trimmed])) {
                    $item_info = $patrimonio_map[$p_num_trimmed];
                    if (stripos($item_info['produto'], 'roteador') !== false) {
                        $detail_string = 'Roteador - ' . $p_num_trimmed;
                        if (!empty($item_info['mac_address'])) {
                            $detail_string .= ", Mac " . $item_info['mac_address'];
                        }
                        $details[] = $detail_string;
                        $is_billable = true;
                    }
                }
            }
        }
        
        // Se a atividade atender a qualquer uma das condições, nós a adicionamos à lista final.
        if ($is_billable) {
            $activity['details'] = $details;
            $billable_activities[] = $activity;
        }
    }

    $response = ['status' => 'success', 'data' => $billable_activities];
    break;

        // Adicione este novo case ao seu index copy.php
        case 'GET_BILLED_ACTIVITIES':
        // Busca atividades já faturadas, incluindo os detalhes da fatura salvos em JSON
        $sql = "SELECT id, clientName, reason, date, detalhes_faturamento 
            FROM atividades_cliente 
            WHERE status_financeiro = 'Faturado' 
            ORDER BY date DESC";
        $response = getData($conn, $sql);
        break;
        // Adicione este novo case no seu index copy.php
        case 'FINALIZE_BILLING':
        // Pega os dados enviados pelo frontend
        $activityId = $_POST['activityId'] ?? 0;
        $billingDetails = $_POST['billingDetails'] ?? null; // Vem como uma string JSON

        if (empty($activityId) || empty($billingDetails)) {
        $response = ['status' => 'error', 'message' => 'Dados insuficientes para faturar.'];
        http_response_code(400);
        break;
        }

        // Prepara o UPDATE no banco de dados
        $stmt = $conn->prepare(
        "UPDATE atividades_cliente SET status_financeiro = 'Faturado', detalhes_faturamento = ? WHERE id = ?"
        );
        $stmt->bind_param("si", $billingDetails, $activityId);

        if ($stmt->execute()) {
        $response = ['status' => 'success', 'message' => 'Atividade faturada com sucesso!'];
        } else {
        $response = ['status' => 'error', 'message' => 'Erro ao atualizar o banco de dados: ' . $stmt->error];
        http_response_code(500);
        }
        $stmt->close();
        break;

        case 'REMOVE_ITEM_FROM_VEHICLE':
    $patrimonio = $_POST['patrimonio'] ?? '';
    $vehicleName = $_POST['vehicleName'] ?? '';
    $vehicle_table_suffix = str_replace(' ', '', strtolower($vehicleName));
    $vehicle_table = 'inventario_veiculos_' . $vehicle_table_suffix;
    // Agora busca o MAC junto
    $stmt_find = $conn->prepare("SELECT produto_id, produto, endereco, patrimonio, mac_address FROM `{$vehicle_table}` WHERE patrimonio = ?");
    $stmt_find->bind_param("s", $patrimonio);
    $stmt_find->execute();
    $result_find = $stmt_find->get_result();
    if ($result_find->num_rows === 1) {
        $item_data = $result_find->fetch_assoc();
        $stmt_find->close();
        $removedFrom = ucfirst($vehicleName);
        // Agora insere o MAC na tabela de redirecionamento
        $stmt_insert = $conn->prepare("INSERT INTO redirecionamento (produto_id, produto, patrimonio, removedFrom, mac_address) VALUES (?, ?, ?, ?, ?)");
        $stmt_insert->bind_param("sssss", $item_data['produto_id'], $item_data['produto'], $item_data['patrimonio'], $removedFrom, $item_data['mac_address']);
        if ($stmt_insert->execute()) {
            $stmt_insert->close();
            $stmt_delete = $conn->prepare("DELETE FROM `{$vehicle_table}` WHERE patrimonio = ?");
            $stmt_delete->bind_param("s", $patrimonio);
            $stmt_delete->execute();
            $stmt_delete->close();
            $response = ['status' => 'success', 'message' => "Item retirado e enviado para redirecionamento."];
        } else { $response = ['status' => 'error', 'message' => 'Erro ao mover item: ' . $stmt_insert->error]; }
    } else { $response = ['status' => 'error', 'message' => "Item {$patrimonio} não encontrado no veículo."]; }
    break;

    // Adicione este case no seu switch ($action)
case 'UPDATE_SAFETY_STOCK':
    $productId = $_POST['productId'] ?? '';
    $newStockLevel = (int)($_POST['newStockLevel'] ?? 0);

    if (empty($productId) || $newStockLevel < 0) {
        $response = ['status' => 'error', 'message' => 'Dados inválidos para atualizar o estoque de segurança.'];
        break;
    }

    $stmt = $conn->prepare("UPDATE produtos SET safetyStock = ? WHERE id = ?");
    $stmt->bind_param("is", $newStockLevel, $productId);

    if ($stmt->execute()) {
        $response = ['status' => 'success', 'message' => 'Estoque de segurança atualizado!'];
    } else {
        $response = ['status' => 'error', 'message' => 'Erro ao atualizar o estoque de segurança: ' . $stmt->error];
    }
    $stmt->close();
    break;

// Adicione este case também, para a funcionalidade de combustível
case 'ADD_ABASTECIMENTO':
    $stmt = $conn->prepare("INSERT INTO abastecimentos (veiculo_nome, data_abastecimento, hodometro, litros, valor_total) VALUES (?, ?, ?, ?, ?)");
    $stmt->bind_param("ssidd", 
        $_POST['veiculoNome'], 
        $_POST['data'], 
        $_POST['hodometro'], 
        $_POST['litros'], 
        $_POST['valor']
    );
    
    if ($stmt->execute()) {
        $response = ['status' => 'success', 'message' => 'Abastecimento registrado com sucesso!'];
    } else {
        $response = ['status' => 'error', 'message' => 'Erro ao registrar abastecimento: ' . $stmt->error];
    }
    $stmt->close();
    break;
            
        // Adicione este novo case dentro do seu switch ($action) em index.php

        case 'REMOVE_ITEM_FROM_RECTIFICATION':
    $patrimonio = $_POST['patrimonio'] ?? '';
    if (empty($patrimonio)) {
        $response = ['status' => 'error', 'message' => 'Patrimônio não fornecido.'];
        break;
    }

    $conn->begin_transaction();
    try {
        // 1. Encontra o item na retífica
        $stmt_find = $conn->prepare("SELECT produto_id, produto, patrimonio, removedFrom FROM materiais_retifica WHERE patrimonio = ?");
        $stmt_find->bind_param("s", $patrimonio);
        $stmt_find->execute();
        $result_find = $stmt_find->get_result();

        if ($result_find->num_rows === 1) {
            $item_data = $result_find->fetch_assoc();
            $stmt_find->close();

            // 2. Insere o item de volta na tabela de redirecionamento
            $stmt_insert = $conn->prepare("INSERT INTO redirecionamento (produto_id, produto, patrimonio, removedFrom) VALUES (?, ?, ?, ?)");
            $stmt_insert->bind_param("ssss", $item_data['produto_id'], $item_data['produto'], $item_data['patrimonio'], $item_data['removedFrom']);
            $stmt_insert->execute();
            $stmt_insert->close();

            // 3. Deleta o item da tabela de retífica
            $stmt_delete = $conn->prepare("DELETE FROM materiais_retifica WHERE patrimonio = ?");
            $stmt_delete->bind_param("s", $patrimonio);
            $stmt_delete->execute();
            $stmt_delete->close();

            $conn->commit();
            $response = ['status' => 'success', 'message' => 'Item retirado da retífica e enviado para redirecionamento.'];
        } else {
            throw new Exception("Item com patrimônio {$patrimonio} não encontrado na retífica.");
        }
    } catch (Exception $e) {
        $conn->rollback();
        $response = ['status' => 'error', 'message' => 'Erro no servidor: ' . $e->getMessage()];
        http_response_code(500);
    }
    break; 

        // Versão CORRIGIDA
case 'REDIRECT_ITEM':
    $patrimonio = $_POST['patrimonio'] ?? '';
    $destination = $_POST['destination'] ?? '';
    // Pega o novo endereço enviado pelo frontend
    $endereco = $_POST['endereco'] ?? ''; 

    $stmt_find = $conn->prepare("SELECT produto_id, produto, patrimonio FROM redirecionamento WHERE patrimonio = ?");
    $stmt_find->bind_param("s", $patrimonio);
    $stmt_find->execute();
    $result_find = $stmt_find->get_result();

    if ($result_find->num_rows === 1) {
        $item_data = $result_find->fetch_assoc();
        $stmt_find->close();
        
        $destination_table = '';
        if ($destination === 'mainInventory') {
            $destination_table = 'inventario_principal';
            // Validação: Se o destino é o estoque principal, o endereço é obrigatório
            if (empty($endereco)) {
                $response = ['status' => 'error', 'message' => 'O endereço é obrigatório para retornar ao Estoque Principal.'];
                http_response_code(400); // Bad Request
                break;
            }
        } else {
            $destination_table = 'inventario_veiculos_' . strtolower($destination);
        }
        
        $stmt_insert = $conn->prepare("INSERT INTO `{$destination_table}` (produto_id, produto, endereco, patrimonio) VALUES (?, ?, ?, ?)");
        // Usa a variável $endereco que veio do formulário
        $stmt_insert->bind_param("ssss", $item_data['produto_id'], $item_data['produto'], $endereco, $item_data['patrimonio']);
        
        if ($stmt_insert->execute()) {
            $stmt_insert->close();
            $stmt_delete = $conn->prepare("DELETE FROM redirecionamento WHERE patrimonio = ?");
            $stmt_delete->bind_param("s", $patrimonio);
            $stmt_delete->execute();
            $stmt_delete->close();
            $response = ['status' => 'success', 'message' => "Item redirecionado com sucesso."];
        } else { 
            $response = ['status' => 'error', 'message' => 'Erro ao inserir no destino: ' . $stmt_insert->error]; 
        }
    } else { 
        $response = ['status' => 'error', 'message' => "Item {$patrimonio} não encontrado para redirecionamento."]; 
    }
    break;

        case 'ADD_ITEM_TO_RECTIFICATION':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $stmt_find = $conn->prepare("SELECT produto_id, produto, patrimonio, removedFrom FROM redirecionamento WHERE patrimonio = ?");
            $stmt_find->bind_param("s", $patrimonio);
            $stmt_find->execute();
            $result_find = $stmt_find->get_result();
            if ($result_find->num_rows === 1) {
                $item_data = $result_find->fetch_assoc();
                $stmt_find->close();
                $stmt_insert = $conn->prepare("INSERT INTO materiais_retifica (produto_id, produto, patrimonio, removedFrom) VALUES (?, ?, ?, ?)");
                $stmt_insert->bind_param("ssss", $item_data['produto_id'], $item_data['produto'], $item_data['patrimonio'], $item_data['removedFrom']);
                if ($stmt_insert->execute()) {
                    $stmt_insert->close();
                    $stmt_delete = $conn->prepare("DELETE FROM redirecionamento WHERE patrimonio = ?");
                    $stmt_delete->bind_param("s", $patrimonio);
                    $stmt_delete->execute();
                    $stmt_delete->close();
                    $response = ['status' => 'success', 'message' => "Item enviado para retífica."];
                } else { $response = ['status' => 'error', 'message' => 'Erro ao enviar para retífica: ' . $stmt_insert->error]; }
            } else { $response = ['status' => 'error', 'message' => "Item {$patrimonio} não encontrado para retífica."]; }
            break;
        
    case 'ADD_CLIENT_ACTIVITY':
    $conn->begin_transaction();
    try {
        $payload = [
            'clientId' => $_POST['clientId'] ?? 0, 'clientName' => $_POST['clientName'] ?? '',
            'userName' => $_POST['userName'] ?? '', 'patrimonio' => $_POST['patrimonio'] ?? '',
            'reason' => $_POST['reason'] ?? '', 'tower' => $_POST['tower'] ?? '',
            'sector' => $_POST['sector'] ?? '',
            'consumiveis' => $_POST['consumables'] ?? null,
            'metragem' => $_POST['cable_length'] ?? null
        ];

        // Passo 1: Insere o registro na tabela de atividades
        $stmt_insert = $conn->prepare("INSERT INTO atividades_cliente (clientId, clientName, userName, patrimonio, reason, date, tower, sector, consumiveis_usados, metragem_cabo) VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?)");
        $stmt_insert->bind_param("issssssss", $payload['clientId'], $payload['clientName'], $payload['userName'], $payload['patrimonio'], $payload['reason'], $payload['tower'], $payload['sector'], $payload['consumiveis'], $payload['metragem']);
        $stmt_insert->execute();
        $stmt_insert->close();
        
        // Passo 2: ATUALIZA a tabela principal de clientes com a nova torre e setor
        if (!empty($payload['tower']) && !empty($payload['sector'])) {
            $stmt_update = $conn->prepare("UPDATE clientes SET tower = ?, sector = ? WHERE id = ?");
            $stmt_update->bind_param("ssi", $payload['tower'], $payload['sector'], $payload['clientId']);
            $stmt_update->execute();
            $stmt_update->close();
        }

        $conn->commit();
        $response = ['status' => 'success', 'message' => 'Atividade registrada e cliente atualizado com sucesso!'];

    } catch (Exception $e) {
        $conn->rollback();
        $response = ['status' => 'error', 'message' => 'Erro no servidor: ' . $e->getMessage()];
        http_response_code(500);
    }
    break;


        // Em index.php, SUBSTITUA todo o seu case 'LOG_TRANSACTION' por este:

    case 'LOG_TRANSACTION':
    // 1. Pegamos o nome do usuário diretamente. É um texto, não um JSON.
    $log_user_name = $_POST['user'] ?? '';

    // 2. Verificamos se o nome é um dos nomes de desenvolvedor.
    if ($log_user_name === 'VF_Soluções' || $log_user_name === 'DEV_Master') {
        // Se for, a gente para aqui e não grava o log.
        $response = ['status' => 'success', 'message' => 'Log not recorded for Dev user.'];
        break;
    }

    // 3. Se não for um dev, o código continua e grava o log normalmente.
    $log_action = $_POST['action_log'] ?? 'N/A';
    $log_patrimonio = $_POST['patrimonio'] ?? 'N/A';
    $log_source = $_POST['source'] ?? 'N/A';
    $log_destination = $_POST['destination'] ?? 'N/A';

    $stmt = $conn->prepare("INSERT INTO logs_transacoes (user, action, patrimonio, source, destination) VALUES (?, ?, ?, ?, ?)");
    // Usamos a mesma variável $log_user_name que já pegamos.
    $stmt->bind_param("sssss", $log_user_name, $log_action, $log_patrimonio, $log_source, $log_destination);
    
    if ($stmt->execute()) {
        $response = ['status' => 'success'];
    } else {
        $response = ['status' => 'error', 'message' => 'Falha ao registrar log.'];
    }
    $stmt->close();
    break;
            
        case 'CHANGE_PASSWORD':
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
        }
            $userId = $_POST['userId'] ?? 0;
            $newPassword = $_POST['newPassword'] ?? '';
            $stmt = $conn->prepare("UPDATE usuarios SET senha = ?, primeiro_login = 0 WHERE id = ?");
            $hashed_new_password = password_hash($newPassword, PASSWORD_DEFAULT);
            $stmt->bind_param("si", $hashed_new_password, $userId);
            if ($stmt->execute()) { $response = ['status' => 'success', 'message' => 'Senha alterada com sucesso!']; } 
            else { $response = ['status' => 'error', 'message' => 'Erro ao alterar a senha: ' . $stmt->error]; }
            $stmt->close();
            break;
        default:
            $response = ['status' => 'error', 'message' => "Ação '{$action}' não reconhecida."];
            break;

        // --- NOVAS AÇÕES DO MÓDULO DE CONSUMO ---
        case 'GET_ITENS_CONSUMIVEIS':
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
        }
            $response = getData($conn, "SELECT id, nome, unidade, quantidadeEstoque FROM itens_consumiveis ORDER BY nome ASC");
            break;
            
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
        }
            $nome = $_POST['nome'] ?? '';
            $unidade = $_POST['unidade'] ?? '';
            $quantidade = (int)($_POST['quantidadeEstoque'] ?? 0);
            
            $stmt = $conn->prepare("INSERT INTO itens_consumiveis (nome, unidade, quantidadeEstoque) VALUES (?, ?, ?)");
            $stmt->bind_param("ssi", $nome, $unidade, $quantidade);
            
            if ($stmt->execute()) {
                $response = ['status' => 'success', 'message' => 'Item de consumo cadastrado com sucesso!'];
            } else {
                if ($conn->errno == 1062) {
                    $response = ['status' => 'error', 'message' => "Erro: O item '{$nome}' já existe."];
                } else {
                    $response = ['status' => 'error', 'message' => 'Erro ao cadastrar item: ' . $stmt->error];
                }
            }
            $stmt->close();
            break;

        case 'ADD_ITEM_CONSUMIVEL':
            $nome = $_POST['nome'] ?? '';
            $unidade = $_POST['unidade'] ?? '';
            $quantidade = (int)($_POST['quantidadeEstoque'] ?? 0);
            
            if (empty($nome) || empty($unidade)) {
                $response = ['status' => 'error', 'message' => 'Nome e Unidade são campos obrigatórios.'];
                http_response_code(400);
                break;
            }

            $stmt = $conn->prepare("INSERT INTO itens_consumiveis (nome, unidade, quantidadeEstoque) VALUES (?, ?, ?)");
            $stmt->bind_param("ssi", $nome, $unidade, $quantidade);
            
            if ($stmt->execute()) {
                $response = ['status' => 'success', 'message' => 'Item de consumo cadastrado com sucesso!'];
            } else {
                if ($conn->errno == 1062) {
                    $response = ['status' => 'error', 'message' => "Erro: O item '{$nome}' já existe."];
                } else {
                    $response = ['status' => 'error', 'message' => 'Erro ao cadastrar item: ' . $stmt->error];
                }
            }
            $stmt->close();
            break;  
            
        // Adicione este novo case no seu switch ($action)
    case 'RECARREGAR_ITEM_CONSUMIVEL':
        $itemId = (int)($_POST['itemId'] ?? 0);
        $quantidadeAdicionada = (int)($_POST['quantidadeAdicionada'] ?? 0);

        if ($itemId <= 0 || $quantidadeAdicionada <= 0) {
        $response = ['status' => 'error', 'message' => 'ID do item e quantidade devem ser válidos e maiores que zero.'];
        http_response_code(400);
        break;
        }

        $stmt = $conn->prepare("UPDATE itens_consumiveis SET quantidadeEstoque = quantidadeEstoque + ? WHERE id = ?");
        $stmt->bind_param("ii", $quantidadeAdicionada, $itemId);

        if ($stmt->execute()) {
        if ($stmt->affected_rows > 0) {
            $response = ['status' => 'success', 'message' => 'Estoque recarregado com sucesso!'];
        } else {
            $response = ['status' => 'error', 'message' => 'Item não encontrado para recarregar. Verifique o ID.'];
        }
        } else {
        $response = ['status' => 'error', 'message' => 'Erro ao recarregar estoque: ' . $stmt->error];
        }
        $stmt->close();
        break;
            
        case 'REGISTRAR_CONSUMO':
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
        }
            $itemId = (int)($_POST['itemId'] ?? 0);
            $quantidadeConsumida = (int)($_POST['quantidadeConsumida'] ?? 0);
            $usuarioId = (int)($_POST['usuarioId'] ?? 0);
            
            $conn->begin_transaction();

            $stmt_get = $conn->prepare("SELECT nome, quantidadeEstoque FROM itens_consumiveis WHERE id = ? FOR UPDATE");
            $stmt_get->bind_param("i", $itemId);
            $stmt_get->execute();
            $result_item = $stmt_get->get_result();

            if($result_item->num_rows === 1) {
                $item = $result_item->fetch_assoc();
                $stmt_get->close();

                if ($item['quantidadeEstoque'] >= $quantidadeConsumida) {
                    $novoEstoque = $item['quantidadeEstoque'] - $quantidadeConsumida;
                    $stmt_update = $conn->prepare("UPDATE itens_consumiveis SET quantidadeEstoque = ? WHERE id = ?");
                    $stmt_update->bind_param("ii", $novoEstoque, $itemId);
                    $update_success = $stmt_update->execute();
                    $stmt_update->close();
                    
                    $stmt_user = $conn->prepare("SELECT nome FROM usuarios WHERE id = ?");
                    $stmt_user->bind_param("i", $usuarioId);
                    $stmt_user->execute();
                    $usuarioNome = $stmt_user->get_result()->fetch_assoc()['nome'] ?? 'Desconhecido';
                    $stmt_user->close();

                    $stmt_log = $conn->prepare("INSERT INTO historico_consumo (item_id, item_nome, quantidade_consumida, usuario_id, usuario_nome) VALUES (?, ?, ?, ?, ?)");
                    $stmt_log->bind_param("isiss", $itemId, $item['nome'], $quantidadeConsumida, $usuarioId, $usuarioNome);
                    $log_success = $stmt_log->execute();
                    $stmt_log->close();
                    
                    if($update_success && $log_success) {
                        $conn->commit();
                        $response = ['status' => 'success', 'message' => 'Consumo registrado com sucesso!'];
                    } else {
                        $conn->rollback();
                        $response = ['status' => 'error', 'message' => 'Falha ao registrar o consumo. Tente novamente.'];
                    }
                } else {
                    $conn->rollback();
                    $response = ['status' => 'error', 'message' => 'Quantidade insuficiente em estoque.'];
                }
            } else {
                $conn->rollback();
                $response = ['status' => 'error', 'message' => 'Item consumível não encontrado.'];
            }
            break;
            
        case 'GET_HISTORICO_CONSUMO':
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]];
        break;
        }
    // Define o mês e ano com base nos parâmetros recebidos ou usa a data atual como padrão
    $month = isset($_POST['month']) ? (int)$_POST['month'] : date('m');
    $year = isset($_POST['year']) ? (int)$_POST['year'] : date('Y');

    $sql = "
        SELECT 
            id, item_nome, quantidade_consumida, usuario_nome, 
            DATE_FORMAT(data_consumo, '%d/%m/%Y') as data_consumo_formatada,
            data_consumo
        FROM historico_consumo 
        WHERE MONTH(data_consumo) = ? AND YEAR(data_consumo) = ?
        ORDER BY data_consumo DESC
    ";
    
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ii", $month, $year);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = [];
    while ($row = $result->fetch_assoc()) { $data[] = $row; }
    $stmt->close();
    $response = ['status' => 'success', 'data' => $data];
    break;
            // Adicione este novo case no seu switch
    case 'GET_CONSUMPTION_LOG_COUNT':
    if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
    // Retorna a estrutura esperada, mas com um valor padrão
    $response = ['status' => 'success', 'data' => ['total' => 0]]; 
    break;
    }
    $sql = "SELECT COUNT(*) as total FROM historico_consumo WHERE MONTH(data_consumo) = MONTH(CURDATE()) AND YEAR(data_consumo) = YEAR(CURDATE())";
    $result = $conn->query($sql);
    $data = $result->fetch_assoc();
    $response = ['status' => 'success', 'data' => $data];
    break;

        // --- NOVAS AÇÕES DO MÓDULO DE COMBUSTÍVEL ---
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
        }
            $stmt = $conn->prepare("INSERT INTO abastecimentos (veiculo_nome, data_abastecimento, hodometro, litros, valor_total) VALUES (?, ?, ?, ?, ?)");
            $stmt->bind_param("ssidd", 
                $_POST['veiculoNome'], 
                $_POST['data'], 
                $_POST['hodometro'], 
                $_POST['litros'], 
                $_POST['valor']
            );
            
            if ($stmt->execute()) {
                $response = ['status' => 'success', 'message' => 'Abastecimento registrado com sucesso!'];
            } else {
                $response = ['status' => 'error', 'message' => 'Erro ao registrar abastecimento: ' . $stmt->error];
            }
            $stmt->close();
            break;

        case 'GET_HISTORICO_COMBUSTIVEL':
        if (isset($_POST['userRole']) && $_POST['userRole'] === 'Desenvolvedor') {
        // Retorna a estrutura esperada, mas com um valor padrão
        $response = ['status' => 'success', 'data' => ['total' => 0]]; 
        break;
    }
    $response = getData($conn, "SELECT id, veiculo_id, veiculo_nome, data_abastecimento, DATE_FORMAT(data_abastecimento, '%d/%m/%Y') as data_formatada, hodometro, litros, valor_total FROM abastecimentos ORDER BY data_abastecimento DESC, id DESC");
    break; 
        // ADICIONE ESTE NOVO CASE NO SEU SWITCH:
        case 'GET_MONTHLY_FUEL_REPORT':
            
    // Define o mês e ano com base nos parâmetros recebidos ou usa a data atual como padrão
    $month = isset($_POST['month']) ? (int)$_POST['month'] : date('m');
    $year = isset($_POST['year']) ? (int)$_POST['year'] : date('Y');

            $sql = "
        SELECT 
            id, veiculo_nome, data_abastecimento, hodometro, litros, valor_total 
        FROM abastecimentos 
        WHERE MONTH(data_abastecimento) = ? AND YEAR(data_abastecimento) = ?
        ORDER BY data_abastecimento DESC
    ";
    

            $stmt = $conn->prepare($sql);
    $stmt->bind_param("ii", $month, $year);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = [];
    while ($row = $result->fetch_assoc()) { $data[] = $row; }
    $stmt->close();
    $response = ['status' => 'success', 'data' => $data];
    break; 
        
        // --- NOVAS AÇÕES DO MÓDULO DE TORRES ---

        case 'GET_TORRES_DATA':
            $torres_sql = "SELECT id, nome FROM torres ORDER BY nome ASC";
            $torres_result = getData($conn, $torres_sql);
            
            $setores_sql = "SELECT torre_id, nome_setor FROM setores";
            $setores_result = getData($conn, $setores_sql);

            $itens_sql = "SELECT torre_id, produto_id, patrimonio FROM itens_alocados";
            $itens_result = getData($conn, $itens_sql);

            $torres_data = $torres_result['data'];
            foreach ($torres_data as $key => $torre) {
                $torre_id = $torre['id'];
                
                $setores_filtrados = array_filter($setores_result['data'], function($s) use ($torre_id) {
                    return $s['torre_id'] == $torre_id;
                });
                $torres_data[$key]['setores'] = array_column($setores_filtrados, 'nome_setor');
                
                $itens_filtrados = array_filter($itens_result['data'], function($i) use ($torre_id) {
                    return $i['torre_id'] == $torre_id;
                });
                $torres_data[$key]['itens'] = array_values($itens_filtrados);
            }
            
            $response = ['status' => 'success', 'data' => $torres_data];
            break;

        case 'ADD_TORRE':
            $conn->begin_transaction();
            try {
                $nome_torre = $_POST['nome'] ?? '';
                $setores = isset($_POST['setores']) ? json_decode($_POST['setores'], true) : [];

                $stmt_torre = $conn->prepare("INSERT INTO torres (nome) VALUES (?)");
                $stmt_torre->bind_param("s", $nome_torre);
                $stmt_torre->execute();
                
                $torre_id = $conn->insert_id;
                $stmt_torre->close();
                
                if (!empty($setores) && $torre_id > 0) {
                    $stmt_setor = $conn->prepare("INSERT INTO setores (torre_id, nome_setor) VALUES (?, ?)");
                    foreach($setores as $setor) {
                        $stmt_setor->bind_param("is", $torre_id, $setor);
                        $stmt_setor->execute();
                    }
                    $stmt_setor->close();
                }
                $conn->commit();
                $response = ['status' => 'success', 'message' => 'Torre e setores cadastrados com sucesso!'];
            } catch (Exception $ex) {
                $conn->rollback();
                $response = ['status' => 'error', 'message' => 'Erro ao cadastrar a torre: ' . $ex->getMessage()];
            }
            break;

        case 'ALOCAR_ITEM_TORRE':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $torre_id = (int)($_POST['torreId'] ?? 0);
            
            $conn->begin_transaction();
            
            $stmt_find = $conn->prepare("SELECT produto_id FROM inventario_principal WHERE patrimonio = ? FOR UPDATE");
            $stmt_find->bind_param("s", $patrimonio);
            $stmt_find->execute();
            $result_find = $stmt_find->get_result();

            if ($result_find->num_rows === 1) {
                $item_data = $result_find->fetch_assoc();
                $stmt_find->close();
                
                $stmt_insert = $conn->prepare("INSERT INTO itens_alocados (torre_id, produto_id, patrimonio) VALUES (?, ?, ?)");
                $stmt_insert->bind_param("iss", $torre_id, $item_data['produto_id'], $patrimonio);

                if ($stmt_insert->execute()) {
                    $stmt_insert->close();
                    $stmt_delete = $conn->prepare("DELETE FROM inventario_principal WHERE patrimonio = ?");
                    $stmt_delete->bind_param("s", $patrimonio);
                    if ($stmt_delete->execute() && $stmt_delete->affected_rows > 0) {
                        $conn->commit();
                        $response = ['status' => 'success', 'message' => 'Item alocado com sucesso!'];
                    } else {
                        $conn->rollback();
                        $response = ['status' => 'error', 'message' => 'Falha ao remover item do estoque principal.'];
                    }
                    $stmt_delete->close();
                } else {
                    $conn->rollback();
                    $response = ['status' => 'error', 'message' => 'Erro ao alocar item na torre: ' . $stmt_insert->error];
                }
            } else {
                $conn->rollback();
                $response = ['status' => 'error', 'message' => "Item com patrimônio {$patrimonio} não encontrado no estoque principal."];
            }
            break;

        case 'RETIRAR_ITEM_TORRE':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $conn->begin_transaction();

            $stmt_find = $conn->prepare("SELECT id, produto_id, patrimonio FROM itens_alocados WHERE patrimonio = ? FOR UPDATE");
            $stmt_find->bind_param("s", $patrimonio);
            $stmt_find->execute();
            $result_find = $stmt_find->get_result();

            if ($result_find->num_rows === 1) {
                $item_data = $result_find->fetch_assoc();
                $stmt_find->close();
                
                $stmt_insert = $conn->prepare("INSERT INTO redirecionamento (produto_id, produto, patrimonio, removedFrom) VALUES (?, ?, ?, 'Torre')");
                $stmt_insert->bind_param("ss", $item_data['produto_id'], $item_data['patrimonio']);

                if ($stmt_insert->execute()) {
                    $stmt_insert->close();
                    $stmt_delete = $conn->prepare("DELETE FROM itens_alocados WHERE id = ?");
                    $stmt_delete->bind_param("i", $item_data['id']);
                    if ($stmt_delete->execute() && $stmt_delete->affected_rows > 0) {
                        $conn->commit();
                        $response = ['status' => 'success', 'message' => 'Item retirado da torre e enviado para redirecionamento.'];
                    } else {
                        $conn->rollback();
                        $response = ['status' => 'error', 'message' => 'Falha ao remover item da torre.'];
                    }
                    $stmt_delete->close();
                } else {
                    $conn->rollback();
                    $response = ['status' => 'error', 'message' => 'Erro ao mover item para redirecionamento: ' . $stmt_insert->error];
                }
            } else {
                $conn->rollback();
                $response = ['status' => 'error', 'message' => "Item com patrimônio {$patrimonio} não encontrado na torre."];
            }
            break; 
            
        // Localize ou adicione este case no seu switch ($action) em index copy.php

        case 'GET_PRODUCTS_SUMMARY':
            $sql = "
                SELECT
                    p.id AS id,
                    p.nome AS nome,
                    p.safetyStock AS safetyStock,
                    COALESCE(i.total, 0) AS quantidadeTotal
                FROM
                    produtos p
                LEFT JOIN (
                    SELECT produto_id, COUNT(*) AS total FROM (
                        SELECT produto_id FROM inventario_principal
                        UNION ALL
                        SELECT produto_id FROM inventario_veiculos_montana
                        UNION ALL
                        SELECT produto_id FROM inventario_veiculos_uno
                        UNION ALL
                        SELECT produto_id FROM inventario_veiculos_pajero
                        UNION ALL
                        SELECT produto_id FROM inventario_veiculos_estoquealternativo
                    ) AS todos_itens
                    GROUP BY
                        produto_id
                ) AS i ON p.id = i.produto_id
                ORDER BY
                    p.nome ASC;
            ";
            $response = getData($conn, $sql);
            break;   
        
        // Adicione este novo case no seu switch em index copy.php

    // Em index.php, substitua o case inteiro por esta versão:

// GARANTA QUE A CASE ESTEJA ASSIM NO SEU INDEX.PHP
// COLE ESTE BLOCO INTEIRO NO LUGAR DO SEU 'GET_CLIENT_ACTIVITY_DETAILS'
// SUBSTITUA A CASE INTEIRA PELA VERSÃO FINAL ABAIXO
case 'GET_CLIENT_ACTIVITY_DETAILS':
    // 1. Busca todos os clientes
    $clients_sql = "SELECT id, name, tower, sector FROM clientes ORDER BY name ASC";
    $clients_result = $conn->query($clients_sql);
    $clients = $clients_result->fetch_all(MYSQLI_ASSOC);

    // 2. Busca todas as atividades
    $activities_sql = "SELECT clientId, patrimonio, consumiveis_usados, metragem_cabo FROM atividades_cliente";
    $activities_result = $conn->query($activities_sql);
    $activities = $activities_result->fetch_all(MYSQLI_ASSOC);

    // 3. Cria o mapa de consulta de todos os patrimônios
    $patrimonio_map_sql = "
    SELECT patrimonio, produto, mac_address FROM inventario_principal
    UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_montana
    UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_uno
    UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_pajero
    UNION ALL SELECT patrimonio, produto, mac_address FROM inventario_veiculos_estoquealternativo
    UNION ALL SELECT patrimonio, produto, mac_address FROM redirecionamento
    UNION ALL SELECT patrimonio, produto, mac_address FROM materiais_retifica
    UNION ALL SELECT ia.patrimonio, p.nome as produto, NULL as mac_address FROM itens_alocados ia JOIN produtos p ON ia.produto_id = p.id
";
    $patrimonio_map_result = $conn->query($patrimonio_map_sql);
    $patrimonio_map = [];
    while ($row = $patrimonio_map_result->fetch_assoc()) {
        $patrimonio_map[trim($row['patrimonio'])] = [
            'produto' => $row['produto'],
            'mac_address' => $row['mac_address']
        ];
    }

    // 4. Junta os dados dos clientes com SUAS ATIVIDADES ACUMULADAS
    foreach ($clients as $key => $client) {
        $client_activities = array_filter($activities, function($act) use ($client) {
            return $act['clientId'] == $client['id'];
        });

        $patrimonios_acumulados = [];
        $consumiveis_acumulados = [];
        $metragens_acumuladas = [];

        // Loop para ACUMULAR dados de todas as atividades
        foreach ($client_activities as $activity) {
            if (!empty($activity['patrimonio'])) {
                $patrimonios_nesta_atividade = explode(',', $activity['patrimonio']);
                $patrimonios_acumulados = array_merge($patrimonios_acumulados, $patrimonios_nesta_atividade);
            }
            if (!empty($activity['consumiveis_usados']) && $activity['consumiveis_usados'] !== '[]') {
                $consumiveis_nesta_atividade = json_decode($activity['consumiveis_usados'], true);
                if (is_array($consumiveis_nesta_atividade)) {
                    $consumiveis_acumulados = array_merge($consumiveis_acumulados, $consumiveis_nesta_atividade);
                }
            }
            if (!empty($activity['metragem_cabo'])) {
                $metragens_acumuladas[] = $activity['metragem_cabo'] . 'm';
            }
        }

        // Processa os patrimônios acumulados para adicionar nomes e MACs
        $patrimonios_processados = [];
        foreach ($patrimonios_acumulados as $p_num) {
            $p_num_trimmed = trim($p_num);
            if (!empty($p_num_trimmed)) {
                if (isset($patrimonio_map[$p_num_trimmed])) {
                    $patrimonios_processados[] = [
                        'patrimonio' => $p_num_trimmed,
                        'productName' => $patrimonio_map[$p_num_trimmed]['produto'],
                        'macAddress' => $patrimonio_map[$p_num_trimmed]['mac_address']
                    ];
                } else {
                     $patrimonios_processados[] = [
                        'patrimonio' => $p_num_trimmed,
                        'productName' => 'Item não localizado',
                        'macAddress' => null
                    ];
                }
            }
        }
        $clients[$key]['patrimonios_used'] = $patrimonios_processados;

        // Adiciona os consumíveis e metragens acumulados e únicos
        $clients[$key]['consumiveis_usados'] = array_values(array_unique($consumiveis_acumulados));
        $clients[$key]['metragem_cabo'] = implode(', ', array_unique($metragens_acumuladas));
    }

    $response = ['status' => 'success', 'data' => $clients];
    break;

    // Adicione este novo case dentro do seu switch em index.php

case 'GET_CLIENT_ACTIVITY_SUMMARY':
    $filterDate = $_POST['filterDate'] ?? date('Y-m'); // Pega a data ou usa o mês atual
    list($year, $month) = explode('-', $filterDate);

    if (!checkdate($month, 1, $year)) { // Validação básica da data
        $response = ['status' => 'error', 'message' => 'Data de filtro inválida.'];
        break;
    }

    // A consulta SQL vai contar as atividades por cliente para o mês e ano especificados
    $sql = "
        SELECT 
            c.name AS clientName,
            COUNT(a.id) AS activityCount
        FROM 
            clientes c
        JOIN 
            atividades_cliente a ON c.id = a.clientId
        WHERE 
            YEAR(a.date) = ? AND MONTH(a.date) = ?
        GROUP BY 
            c.name
        ORDER BY 
            activityCount DESC
    ";

    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $year, $month);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = $result->fetch_all(MYSQLI_ASSOC);
    $stmt->close();

    $response = ['status' => 'success', 'data' => $data];
    break;

    // 4. Junta tudo em uma única resposta para o frontend
    foreach ($clients as $key => $client) {
        $client_activities = array_filter($activities, function($act) use ($client) {
            return $act['clientId'] == $client['id'];
        });

        $patrimonios_usados_raw = array_reduce($client_activities, function($carry, $act) {
            return array_merge($carry, explode(',', $act['patrimonio']));
        }, []);

        $patrimonios_usados_com_nome = [];
        foreach ($patrimonios_usados_raw as $p_num) {
            $p_num = trim($p_num);
            if (!empty($p_num)) {
                $patrimonios_usados_com_nome[] = [
                    'patrimonio' => $p_num,
                    'productName' => $patrimonio_map[$p_num] ?? 'Produto não encontrado'
                ];
            }
        }
        $clients[$key]['patrimonios_used'] = $patrimonios_usados_com_nome;
    }

    $response = ['status' => 'success', 'data' => $clients];
    break;    
    }
} catch (Exception $e) {
    $response = ['status' => 'error', 'message' => 'Erro fatal: ' . $e->getMessage()];
    http_response_code(500);
}

$conn->close();
echo json_encode($response);
?>