'OpenAI API key not configured.']; } $prompt = "I have two CSV files. I want to convert the input file to the output file format.\n\n"; $prompt .= "Here is a sample of the input CSV file:\n---\n" . $inputSample . "\n---\n\n"; $prompt .= "Here is a sample of the output CSV file:\n---\n" . $outputSample . "\n---\n\n"; $prompt .= "Please generate a PHP script that contains a single function `convert_csv($input_file_path, $output_file_path)`.\n"; $prompt .= "This function should read the data from the `$input_file_path`, transform it into the format of the output sample, and write the result to `$output_file_path`.\n"; $prompt .= "The script should handle CSV headers correctly. Do not include any explanations, just the raw PHP code starting with ` 'gpt-5', 'messages' => [ [ 'role' => 'user', 'content' => $prompt ] ] ]; $ch = curl_init('https://api.openai.com/v1/chat/completions'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $apiKey ]); $response = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpcode != 200) { return ['error' => 'Failed to connect to OpenAI API. Response: ' . $response]; } $result = json_decode($response, true); if (isset($result['choices'][0]['message']['content'])) { $php_code = $result['choices'][0]['message']['content']; // Clean up the response to get only the code if (strpos($php_code, '```php') !== false) { $php_code = substr($php_code, strpos($php_code, '```php') + 5); $php_code = substr($php_code, 0, strrpos($php_code, '```')); } if (strpos($php_code, ' true, 'code' => $php_code]; } return ['error' => 'Could not extract PHP code from OpenAI response.', 'details' => $result]; } load_env(__DIR__ . '/.env'); $action = $_POST['action'] ?? $_GET['action'] ?? ''; if ($action === 'build_mapping') { if (!isset($_FILES['inputSample']) || !isset($_FILES['outputSample'])) { echo json_encode(['success' => false, 'error' => 'Input and output sample files are required.']); exit; } $inputTmpPath = $_FILES['inputSample']['tmp_name']; $outputTmpPath = $_FILES['outputSample']['tmp_name']; $inputSampleContent = get_csv_sample($inputTmpPath); $outputSampleContent = get_csv_sample($outputTmpPath); if ($inputSampleContent === null || $outputSampleContent === null) { echo json_encode(['success' => false, 'error' => 'Failed to read sample files.']); exit; } $result = call_openai_api($inputSampleContent, $outputSampleContent); if (isset($result['error'])) { echo json_encode(['success' => false, 'error' => $result['error'], 'details' => $result['details'] ?? null]); exit; } $mappingDir = __DIR__ . '/mappings'; if (!is_dir($mappingDir)) { mkdir($mappingDir, 0775, true); } $mappingFile = 'mappings/mapping_' . time() . '.php'; file_put_contents($mappingFile, $result['code']); echo json_encode(['success' => true, 'mapping_file' => $mappingFile]); exit; } if ($action === 'convert') { if (!isset($_FILES['fullInputFile']) || !isset($_POST['mappingFile'])) { echo json_encode(['success' => false, 'error' => 'Input file and mapping file are required.']); exit; } $mappingFile = $_POST['mappingFile']; if (!file_exists($mappingFile)) { echo json_encode(['success' => false, 'error' => 'Mapping file not found.']); exit; } require_once $mappingFile; if (!function_exists('convert_csv')) { echo json_encode(['success' => false, 'error' => 'Invalid mapping file: convert_csv function not found.']); exit; } $inputTmpPath = $_FILES['fullInputFile']['tmp_name']; $outputDir = __DIR__ . '/outputs'; if (!is_dir($outputDir)) { mkdir($outputDir, 0775, true); } $outputFile = $outputDir . '/converted_' . time() . '.csv'; try { convert_csv($inputTmpPath, $outputFile); echo json_encode(['success' => true, 'download_url' => basename($outputFile)]); } catch (Exception $e) { echo json_encode(['success' => false, 'error' => 'Error during conversion: ' . $e->getMessage()]); } exit; } echo json_encode(['success' => false, 'error' => 'No action specified.']);