<?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 = '+00: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 === $user['senha']) { 
                    unset($user['senha']);
                    $response = ['status' => 'success', 'user' => $user];
                } else { $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': $response = getData($conn, "SELECT id, nome AS name, email, funcao AS role FROM usuarios ORDER BY nome ASC"); 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:%SZ') 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;

        // --- AÇÕES DE ESCRITA E MOVIMENTAÇÃO ---
        case 'ADD_INVENTORY_ITEM':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $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."];
                break;
            }
            $check_stmt->close();
            $stmt = $conn->prepare("INSERT INTO inventario_principal (produto_id, produto, endereco, patrimonio) VALUES (?, ?, ?, ?)");
            $stmt->bind_param("ssss", $_POST['id'], $_POST['produto_nome'], $_POST['endereco'], $_POST['patrimonio']);
            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':
            $stmt = $conn->prepare("INSERT INTO usuarios (nome, email, senha, funcao) VALUES (?, ?, ?, ?)");
            $stmt->bind_param("ssss", $_POST['name'], $_POST['email'], $_POST['password'], $_POST['role']);
            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'] ?? '');
            $stmt_find = $conn->prepare("SELECT produto_id, produto, endereco, patrimonio 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 = 'inventario_veiculos_' . $vehicleName;
                $stmt_insert = $conn->prepare("INSERT INTO `{$vehicle_table}` (produto_id, produto, endereco, patrimonio) VALUES (?, ?, ?, ?)");
                $stmt_insert->bind_param("ssss", $item_data['produto_id'], $item_data['produto'], $item_data['endereco'], $item_data['patrimonio']);
                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;
        case 'REMOVE_ITEM_FROM_VEHICLE':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $vehicleName = strtolower($_POST['vehicleName'] ?? '');
            $vehicle_table = 'inventario_veiculos_' . $vehicleName;
            $stmt_find = $conn->prepare("SELECT produto_id, produto, endereco, patrimonio 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);
                $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'], $removedFrom);
                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();
                    if ($stmt_delete->affected_rows > 0) {
                        $response = ['status' => 'success', 'message' => "Item retirado e enviado para redirecionamento."];
                    } else {
                        $response = ['status' => 'error', 'message' => "Falha ao deletar o item do veículo após movê-lo."];
                    }
                    $stmt_delete->close();
                } else {
                    $response = ['status' => 'error', 'message' => 'Erro ao mover item para redirecionamento: ' . $stmt_insert->error];
                }
            } else {
                $response = ['status' => 'error', 'message' => "Item com patrimônio {$patrimonio} não encontrado no veículo."];
            }
            break; 
        case 'REDIRECT_ITEM':
            $patrimonio = $_POST['patrimonio'] ?? '';
            $destination = $_POST['destination'] ?? '';
            $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';
                } else {
                    $destination_table = 'inventario_veiculos_' . strtolower($destination);
                }
                $stmt_insert = $conn->prepare("INSERT INTO `{$destination_table}` (produto_id, produto, endereco, patrimonio) VALUES (?, ?, ?, ?)");
                $endereco = '';
                $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':
            $payload = [
                'clientId' => $_POST['clientId'] ?? 0, 'clientName' => $_POST['clientName'] ?? '',
                'userName' => $_POST['userName'] ?? '', 'patrimonio' => $_POST['patrimonio'] ?? '',
                'reason' => $_POST['reason'] ?? '', 'tower' => $_POST['tower'] ?? '',
                'sector' => $_POST['sector'] ?? ''
            ];
            $stmt = $conn->prepare("INSERT INTO atividades_cliente (clientId, clientName, userName, patrimonio, reason, date, tower, sector) VALUES (?, ?, ?, ?, ?, NOW(), ?, ?)");
            $stmt->bind_param("issssss", $payload['clientId'], $payload['clientName'], $payload['userName'], $payload['patrimonio'], $payload['reason'], $payload['tower'], $payload['sector']);
            if ($stmt->execute()) { $response = ['status' => 'success', 'message' => 'Atividade registrada com sucesso!']; }
            else { $response = ['status' => 'error', 'message' => 'Erro ao registrar atividade: ' . $stmt->error]; }
            $stmt->close();
            break;
        case 'LOG_TRANSACTION':
            $log_user = $_POST['user'] ?? 'N/A';
            $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 (?, ?, ?, ?, ?)");
            $stmt->bind_param("sssss", $log_user, $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':
            $userId = $_POST['userId'] ?? 0;
            $newPassword = $_POST['newPassword'] ?? '';
            $stmt = $conn->prepare("UPDATE usuarios SET senha = ?, primeiro_login = 0 WHERE id = ?");
            $stmt->bind_param("si", $newPassword, $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':
            $response = getData($conn, "SELECT id, nome, unidade, quantidadeEstoque FROM itens_consumiveis ORDER BY nome ASC");
            break;
            
        case 'ADD_ITEM_CONSUMIVEL':
            $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 'REGISTRAR_CONSUMO':
            $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':
            $response = getData($conn, "SELECT id, item_nome, quantidade_consumida, usuario_nome, DATE_FORMAT(CONVERT_TZ(data_consumo, 'UTC', 'America/Sao_Paulo'), '%d/%m/%Y %H:%i') as data_consumo_formatada FROM historico_consumo ORDER BY data_consumo DESC");
            break;

        // --- NOVAS AÇÕES DO MÓDULO 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;

        case 'GET_HISTORICO_COMBUSTIVEL':
            $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; 
            
            
    }
} catch (Exception $e) {
    $response = ['status' => 'error', 'message' => 'Erro fatal: ' . $e->getMessage()];
    http_response_code(500);
}

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