<?php
error_reporting(0);
ini_set('display_errors', 0);
ob_start();

require_once __DIR__ . '/Logger.php';
require_once __DIR__ . '/DataValidator.php';
require_once __DIR__ . '/ApiException.php';
require_once __DIR__ . '/utils.php';
require_once __DIR__ . '/gen.php';
$configFile = require __DIR__ . '/config.php';
$config = array_merge(
    ['ALLOWED_ORIGINS' => '*', 'LOG_DIR' => __DIR__ . '/logs'],
    is_array($configFile) ? $configFile : []
);

// Configurações de cabeçalhos
header('Content-Type: application/json');
header("Access-Control-Allow-Origin: {$config['ALLOWED_ORIGINS']}");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Max-Age: 3600");

// Responder imediatamente para requisições OPTIONS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// Inicializa o logger
$logger = new Logger($config['LOG_DIR']);

try {
    // Para requisições POST, pega os dados do body
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $input = json_decode(file_get_contents('php://input'), true) ?? [];
    } else {
        $input = $_GET ?? [];
    }

    // Usar dados do cliente se enviados; caso contrário, gerar
    $dados = GeradorDadosPessoais::gerarTodosDados();
    $validator = new DataValidator();

    $nome_completo = !empty($input['name']) ? trim(htmlspecialchars($input['name'])) : $dados['nome_completo'];
    $email = !empty($input['email']) ? trim($input['email']) : $dados['email'];
    $cpf = !empty($input['cpf']) ? preg_replace('/\D/', '', $input['cpf']) : null;
    if (!$cpf) $cpf = preg_replace('/\D/', '', $dados['cpf']);
    $cpf_formatado = strlen($cpf) >= 11 ? preg_replace('/(\d{3})(\d{3})(\d{3})(\d{2})/', '$1.$2.$3-$4', substr($cpf, 0, 11)) : $dados['cpf'];
    $telefone = !empty($input['phone']) ? trim(htmlspecialchars($input['phone'])) : $dados['telefone'];

    $params = [
        'value' => isset($input['value']) ? $validator->sanitizeValue($input['value']) : null,
        'utm_source' => isset($input['utm_source']) ? htmlspecialchars($input['utm_source']) : null,
        'utm_medium' => isset($input['utm_medium']) ? htmlspecialchars($input['utm_medium']) : null,
        'utm_campaign' => isset($input['utm_campaign']) ? htmlspecialchars($input['utm_campaign']) : null,
        'utm_content' => isset($input['utm_content']) ? htmlspecialchars($input['utm_content']) : null,
        'utm_term' => isset($input['utm_term']) ? htmlspecialchars($input['utm_term']) : null,
        'reference' => isset($input['reference']) ? htmlspecialchars($input['reference']) : null,
        'name' => $nome_completo,
        'produto_nome' => 'Hot Wheels - Pedido Online',
        'email' => $email,
        'cpf' => $cpf_formatado,
        'items' => isset($input['items']) ? $input['items'] : []
    ];

    // Validações específicas
    if (!$params['value']) {
        throw new ApiException('Parâmetro "value" é obrigatório', 400, 'MISSING_VALUE');
    }

    $validator->validateMonetaryValue($params['value']);

    if ($params['email']) {
        $validator->validateEmail($params['email']);
    }

    // Dados fixos para Yamato Sushi
    $string_checkout = "646f5e280b0b2d793b0a2fe77e208556";
    $dominio = "ingress-f1.com.br";
    $produto_id = "1";

    // Monta payload para geração do Pix
    $pixData = [
        'name' => $params['name'] ?? '',
        'cpf' => $params['cpf'] ?? '',
        'email' => $params['email'] ?? 'cliente@yamatosushi.com',
        'phone' => $telefone,
        'payment' => $string_checkout,
        'direct' => $dominio,
        'produto_id' => $produto_id,
        'valor' => str_replace(',', '.', $params['value']),
        'items' => $params['items'] ?: [[
            'name' => $params['produto_nome'] ?? "Pedido Hot Wheels",
            'price' => floatval(str_replace(',', '.', $params['value'])),
            'quantity' => 1,
            'subtotal' => floatval(str_replace(',', '.', $params['value']))
        ]],
        'tracking' => [
            'utm_source' => $params['utm_source'],
            'utm_medium' => $params['utm_medium'],
            'utm_campaign' => $params['utm_campaign'],
            'utm_term' => $params['utm_term'],
            'utm_content' => $params['utm_content'],
            'gclid' => $input['gclid'] ?? null,
            'fbclid' => $input['fbclid'] ?? null,
            'ttclid' => $input['ttclid'] ?? null,
            'msclkid' => $input['msclkid'] ?? null,
            'fbp' => $_COOKIE['_fbp'] ?? null,
            'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? null,
            'ip_address' => $_SERVER['REMOTE_ADDR'] ?? null,
        ],
        'quantity' => 1,
        'timestamp' => date('c')
    ];

    // Envia para o gerador de PIX
    $pixResponse = makeCurlRequest('https://pay.arkwave.com.br/gerar.php', 'POST', $pixData);

    if (!$pixResponse || $pixResponse['status'] !== 200) {
        throw new ApiException('Erro ao gerar código PIX. Por favor, tente novamente.', 500);
    }

    $pixData = json_decode($pixResponse['data'], true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new ApiException('Erro ao processar resposta do PIX.', 500);
    }
    $qr = $pixData['qrcode'] ?? '';
    $response = [
        'success' => true,
        'data' => [
            'id' => $pixData['id'] ?? '',
            'copiaecola' => $pixData['qrcode'] ?? '',
            'qrcode_image' => "https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=$qr"  ?? '',
            'transactionId' => $pixData['id'] ?? '',
            'valor' => $params['value'],
            'expires_in' => 1800 // 30 minutos
        ]
    ];

    ob_end_clean();
    echo json_encode($response);

} catch (ApiException $e) {
    ob_end_clean();
    $logger->logError($e);
    http_response_code($e->getCode());
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage(),
        'code' => $e->getErrorCode()
    ]);
} catch (Exception $e) {
    ob_end_clean();
    $logger->logError($e);
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Erro interno no servidor'
    ]);
}
?>
