<?php
/**
 * API: Calcular Frete
 * 
 * Endpoint para calcular opções de frete.
 * POST: { store_id, items: [{product_id, quantity}], zipcode, cart_total? }
 * 
 * Usado pelo simulador de frete na PDP e no checkout.
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit(0);
}

require_once __DIR__ . '/../../includes/config.php';
require_once __DIR__ . '/../../includes/Shipping/ShippingService.php';

use Shipping\ShippingService;

try {
    $pdo = getDB();
    
    // Receber dados
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        throw new Exception('Dados inválidos');
    }
    
    $storeId = intval($input['store_id'] ?? 0);
    $items = $input['items'] ?? [];
    $zipcode = preg_replace('/\D/', '', $input['zipcode'] ?? '');
    $cartTotal = floatval($input['cart_total'] ?? 0);
    
    // Validações
    if (!$storeId) {
        throw new Exception('store_id é obrigatório');
    }
    
    if (empty($items)) {
        throw new Exception('items é obrigatório');
    }
    
    if (strlen($zipcode) !== 8) {
        throw new Exception('CEP inválido (deve ter 8 dígitos)');
    }
    
    // Verificar se loja existe
    $storeStmt = $pdo->prepare("SELECT id, origin_zipcode FROM stores WHERE id = ? AND is_active = 1");
    $storeStmt->execute([$storeId]);
    $store = $storeStmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$store) {
        throw new Exception('Loja não encontrada');
    }
    
    if (!$store['origin_zipcode']) {
        echo json_encode([
            'success' => false,
            'error' => 'Loja não configurou endereço de origem para frete',
            'options' => []
        ]);
        exit;
    }
    
    // Calcular frete
    $shippingService = new ShippingService($pdo, $storeId);
    $options = $shippingService->calculateShippingOptions($items, $zipcode, $cartTotal);
    
    // Se retornou erro
    if (isset($options['error'])) {
        echo json_encode([
            'success' => false,
            'error' => $options['error'],
            'options' => []
        ]);
        exit;
    }
    
    // Retornar opções
    echo json_encode([
        'success' => true,
        'zipcode' => $zipcode,
        'options' => $options,
        'count' => count($options)
    ]);
    
} catch (Exception $e) {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
