<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Content-Type: application/json; charset=UTF-8');

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

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Metodo no permitido.']);
    exit;
}

require_once 'conexion.php';

function responder($statusCode, $payload, $conn = null)
{
    http_response_code($statusCode);
    echo json_encode($payload, JSON_UNESCAPED_UNICODE);
    if ($conn) {
        mysqli_close($conn);
    }
    exit;
}

function normalizarTelefono($telefono)
{
    $numero = preg_replace('/\D/', '', (string)$telefono);
    if (strlen($numero) === 9) {
        $numero = '51' . $numero;
    }
    return $numero;
}

function calcularStockDisponiblePedido($conn, $idPres, $receta, $crtStock, $stockPresentacion)
{
    if ((int)$crtStock !== 1) {
        return null;
    }

    if ((int)$receta !== 1) {
        return max(0, (int)floor((float)$stockPresentacion));
    }

    $idPres = (int)$idPres;
    $sqlIngredientes = "
        SELECT pi.cant, ins.stock
        FROM tm_producto_ingr pi
        INNER JOIN tm_insumo ins ON ins.id_ins = pi.id_ins
        WHERE pi.id_pres = {$idPres}
    ";

    $resultIngredientes = mysqli_query($conn, $sqlIngredientes);
    if (!$resultIngredientes) {
        return 0;
    }

    $maxUnidades = null;
    while ($ing = mysqli_fetch_assoc($resultIngredientes)) {
        $cantNecesaria = (float)$ing['cant'];
        $stockInsumo = (float)$ing['stock'];

        if ($cantNecesaria <= 0) {
            continue;
        }

        $unidadesPosibles = (int)floor($stockInsumo / $cantNecesaria);
        $maxUnidades = is_null($maxUnidades)
            ? $unidadesPosibles
            : min($maxUnidades, $unidadesPosibles);
    }

    if (is_null($maxUnidades)) {
        return 0;
    }

    return max(0, (int)$maxUnidades);
}

$sqlConfig = "SELECT plan FROM tm_configuracion LIMIT 1";
$resultConfig = mysqli_query($conn, $sqlConfig);

if (!$resultConfig || mysqli_num_rows($resultConfig) === 0) {
    responder(500, ['success' => false, 'message' => 'No se pudo obtener la configuracion del sistema.'], $conn);
}

$configRow = mysqli_fetch_assoc($resultConfig);
$planJson = json_decode($configRow['plan'], true);

if (json_last_error() !== JSON_ERROR_NONE || empty($planJson['wsp_token'])) {
    responder(500, ['success' => false, 'message' => 'La configuracion de WhatsApp es invalida o no tiene token.'], $conn);
}

$apiToken = $planJson['wsp_token'];

$payloadRaw = file_get_contents('php://input');
$pedido = json_decode($payloadRaw, true);

if (!is_array($pedido)) {
    responder(400, ['success' => false, 'message' => 'Payload JSON invalido.'], $conn);
}

$cliente = $pedido['cliente'] ?? [];
$productosPayload = $pedido['productos'] ?? [];

$nombreCliente = trim((string)($cliente['nombre'] ?? ''));
$telefonoCliente = trim((string)($cliente['telefono'] ?? ''));
$direccionCliente = trim((string)($cliente['direccion'] ?? ''));
$referenciaCliente = trim((string)($cliente['referencia'] ?? ''));
$comentarioCliente = trim((string)($cliente['comentario'] ?? ''));

if ($nombreCliente === '' || $telefonoCliente === '' || $direccionCliente === '') {
    responder(400, ['success' => false, 'message' => 'Nombre, telefono y direccion son obligatorios.'], $conn);
}

if (!is_array($productosPayload) || count($productosPayload) === 0) {
    responder(400, ['success' => false, 'message' => 'El pedido no contiene productos.'], $conn);
}

$erroresValidacion = [];
$detallePedido = [];
$totalCalculado = 0.0;

foreach ($productosPayload as $item) {
    $idPres = isset($item['id_pres']) ? (int)$item['id_pres'] : (int)($item['id'] ?? 0);
    $cantidadInput = $item['cantidad'] ?? null;
    if (!is_numeric($cantidadInput)) {
        $erroresValidacion[] = 'Cantidad invalida en el pedido.';
        continue;
    }
    $cantidad = (int)$cantidadInput;

    if ($idPres <= 0 || $cantidad <= 0 || (float)$cantidadInput != $cantidad) {
        $erroresValidacion[] = 'Producto o cantidad invalida en el pedido.';
        continue;
    }

    $sqlProducto = "
        SELECT
            pres.id_pres,
            pres.presentacion,
            pres.precio,
            pres.precio_delivery,
            pres.receta,
            pres.crt_stock,
            pres.stock,
            pres.delivery,
            pres.estado AS pres_estado,
            prod.estado AS prod_estado,
            catg.estado AS catg_estado
        FROM tm_producto_pres pres
        INNER JOIN tm_producto prod ON pres.id_prod = prod.id_prod
        INNER JOIN tm_producto_catg catg ON prod.id_catg = catg.id_catg
        WHERE pres.id_pres = {$idPres}
        LIMIT 1
    ";

    $resultProducto = mysqli_query($conn, $sqlProducto);
    if (!$resultProducto || mysqli_num_rows($resultProducto) === 0) {
        $erroresValidacion[] = "Producto no encontrado (id_pres={$idPres}).";
        continue;
    }

    $producto = mysqli_fetch_assoc($resultProducto);

    if ((int)$producto['delivery'] !== 1 || $producto['pres_estado'] !== 'a' || $producto['prod_estado'] !== 'a' || $producto['catg_estado'] !== 'a') {
        $erroresValidacion[] = "El producto {$producto['presentacion']} no esta disponible para delivery.";
        continue;
    }

    $stockDisponible = calcularStockDisponiblePedido(
        $conn,
        $producto['id_pres'],
        $producto['receta'],
        $producto['crt_stock'],
        $producto['stock']
    );

    if (!is_null($stockDisponible) && $cantidad > $stockDisponible) {
        $erroresValidacion[] = "Stock insuficiente para {$producto['presentacion']}. Disponible: {$stockDisponible}.";
        continue;
    }

    $precioUnitario = (float)$producto['precio_delivery'] > 0
        ? (float)$producto['precio_delivery']
        : (float)$producto['precio'];

    $subtotal = round($precioUnitario * $cantidad, 2);
    $totalCalculado += $subtotal;

    $detallePedido[] = [
        'id_pres' => (int)$producto['id_pres'],
        'presentacion' => $producto['presentacion'],
        'cantidad' => (int)$cantidad,
        'precio_unitario' => $precioUnitario,
        'subtotal' => $subtotal,
    ];
}

if (count($erroresValidacion) > 0) {
    responder(400, [
        'success' => false,
        'message' => 'No se pudo validar el pedido.',
        'errors' => $erroresValidacion,
    ], $conn);
}

$mensaje = "✅ *Hola {$nombreCliente}, recibimos tu pedido.* ✅\n\n";
$mensaje .= "Estamos preparando tus productos y pronto estaran en camino:\n";
$mensaje .= "📍 *Direccion:* {$direccionCliente}\n";

if ($referenciaCliente !== '') {
    $mensaje .= "▪️ *Referencia:* {$referenciaCliente}\n";
}

if ($comentarioCliente !== '') {
    $mensaje .= "▪️ *Comentario:* {$comentarioCliente}\n";
}

$mensaje .= "\n📦 *RESUMEN DE TU PEDIDO:*\n";
foreach ($detallePedido as $detalle) {
    $mensaje .= "▪️ ({$detalle['cantidad']}x) {$detalle['presentacion']} - S/ " . number_format($detalle['subtotal'], 2, '.', '') . "\n";
}

$mensaje .= "\n💰 *TOTAL A PAGAR:* S/ " . number_format($totalCalculado, 2, '.', '') . "\n\n";
$mensaje .= "Gracias por tu preferencia.";

$numeroDestino = normalizarTelefono($telefonoCliente);
if ($numeroDestino === '') {
    responder(400, ['success' => false, 'message' => 'El telefono del cliente es invalido.'], $conn);
}

$urlApi = 'https://efasis.efa-api.com/api/message/send-text';
$bodyApi = json_encode([
    'number' => $numeroDestino,
    'message' => $mensaje,
], JSON_UNESCAPED_UNICODE);

$ch = curl_init($urlApi);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyApi);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $apiToken,
    'Content-Type: application/json',
]);

$responseApi = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);

if ($curlError) {
    responder(500, ['success' => false, 'message' => 'Error de conexion con el proveedor WhatsApp.'], $conn);
}

if ($httpCode >= 200 && $httpCode < 300) {
    responder(200, [
        'success' => true,
        'message' => 'Pedido enviado por WhatsApp correctamente.',
        'total_calculado' => number_format($totalCalculado, 2, '.', ''),
        'items' => count($detallePedido),
    ], $conn);
}

$apiError = json_decode($responseApi, true);
$errorMessage = isset($apiError['error']['response']['message'][0]['exists']) && $apiError['error']['response']['message'][0]['exists'] === false
    ? 'El numero de telefono proporcionado no tiene WhatsApp.'
    : 'Error al enviar la confirmacion por WhatsApp.';

responder(500, [
    'success' => false,
    'message' => $errorMessage,
    'http_code' => $httpCode,
], $conn);
?>
