<?php
/**
 * pedidos-stock-crear.php
 * POST → crea una nueva transacción tipo 5 (pedido de stock entre centros)
 *
 * Body JSON:
 * {
 *   "id_centro_origen": 3,       // usuarios_ci_idusuarios_ci (quien envía)
 *   "id_centro_destino": 5,      // cdentrega (quien recibe)
 *   "productos": [
 *     { "idprod": 12, "cant": 10 },
 *     { "idprod": 7,  "cant": 5  }
 *   ],
 *   "observaciones": "Texto libre"  // opcional
 * }
 *
 * Lógica (basada en AlmacenController::enviarMercanciaParaCD):
 *  1. Insertar transacción tipo 5, statusentrega = PENDIENTE
 *  2. Por cada producto: insertar en tabla pedido
 *  3. Descontar del stock del centro origen (tabla stock, idcd = id_centro_origen)
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Content-Type');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'error' => 'Método no permitido']);
    exit;
}

require_once __DIR__ . '/../../config.php';
$db = getDB();

// ── Validar token ─────────────────────────────────────────────────────────────
$headers    = getallheaders();
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    http_response_code(401);
    echo json_encode(['ok' => false, 'error' => 'Token requerido']);
    exit;
}
$token = trim($m[1]);
$stmtTok = $db->prepare("SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW()");
$stmtTok->execute([$token]);
if (!$stmtTok->fetch()) {
    http_response_code(401);
    echo json_encode(['ok' => false, 'error' => 'Sesión inválida o expirada']);
    exit;
}

// ── Leer y validar body ───────────────────────────────────────────────────────
$body = json_decode(file_get_contents('php://input'), true);
$idOrigen  = isset($body['id_centro_origen'])  ? (int)$body['id_centro_origen']  : 0;
$idDestino = isset($body['id_centro_destino']) ? (int)$body['id_centro_destino'] : 0;
$productos = $body['productos'] ?? [];
$obs       = trim($body['observaciones'] ?? '');

if ($idOrigen <= 0 || $idDestino <= 0) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'Centro origen y destino son requeridos']);
    exit;
}
if (empty($productos)) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'Debe incluir al menos un producto']);
    exit;
}

// Validar que el destino esté permitido para el origen
$stmtCE = $db->prepare("SELECT transferirA FROM centros_entrega WHERE idcd = ?");
$stmtCE->execute([$idOrigen]);
$rowCE = $stmtCE->fetch(PDO::FETCH_ASSOC);
if (!$rowCE) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'El centro origen no tiene configuración de destinos']);
    exit;
}
$destinosPermitidos = array_map('intval', explode(',', trim($rowCE['transferirA'] ?? '')));
if (!in_array($idDestino, $destinosPermitidos)) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'El destino seleccionado no está permitido para este centro']);
    exit;
}

// ── Transacción BD ────────────────────────────────────────────────────────────
try {
    $db->beginTransaction();

    // 1. Crear transacción tipo 5 — fechae y timee quedan NULL hasta que se entregue
    $stmtTx = $db->prepare("
        INSERT INTO transacciones
            (inversionista_id_inver, tipostr_idtipostr, fechat, horat,
             usuarios_ci_idusuarios_ci, cdentrega, statusentrega,
             fechae, timee, observaciones, porpagarr)
        VALUES
            (0, 5, CURDATE(), CURTIME(),
             ?, ?, 'PENDIENTE',
             NULL, NULL, ?, 0)
    ");
    $stmtTx->execute([$idOrigen, $idDestino, $obs]);
    $idTransaccion = (int)$db->lastInsertId();

    // 2. Insertar productos y descontar stock
    $stmtPed = $db->prepare("
        INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant)
        VALUES (?, ?, ?)
    ");
    $stmtStockSel = $db->prepare("SELECT idstock, cantidad FROM stock WHERE idcd = ? AND idprod = ?");
    $stmtStockUpd = $db->prepare("UPDATE stock SET cantidad = cantidad - ? WHERE idcd = ? AND idprod = ?");
    $stmtStockIns = $db->prepare("INSERT INTO stock (idcd, idprod, cantidad) VALUES (?, ?, ?)");

    foreach ($productos as $prod) {
        $idprod = (int)($prod['idprod'] ?? 0);
        $cant   = (int)($prod['cant']   ?? 0);
        if ($idprod <= 0 || $cant <= 0) continue;

        // Insertar en pedido
        $stmtPed->execute([$idTransaccion, $idprod, $cant]);

        // Descontar del stock del centro origen
        $stmtStockSel->execute([$idOrigen, $idprod]);
        $stockRow = $stmtStockSel->fetch(PDO::FETCH_ASSOC);
        if ($stockRow) {
            $stmtStockUpd->execute([$cant, $idOrigen, $idprod]);
        } else {
            // Si no existe registro, crear con cantidad negativa
            $stmtStockIns->execute([$idOrigen, $idprod, -$cant]);
        }
    }

    $db->commit();

    echo json_encode([
        'ok'             => true,
        'idtransacciones' => $idTransaccion,
        'mensaje'        => "Pedido de stock #$idTransaccion creado correctamente",
    ], JSON_UNESCAPED_UNICODE);

} catch (Exception $e) {
    $db->rollBack();
    http_response_code(500);
    echo json_encode(['ok' => false, 'error' => 'Error al crear el pedido: ' . $e->getMessage()]);
}
