<?php
/**
 * entrega-confirmar.php
 * Confirma la entrega de una nota individual (tipo 10/11) o agrupada (tipo 15).
 * Descuenta los productos del stock del centro de entrega.
 *
 * POST body (JSON):
 * {
 *   "idtransacciones": 101,
 *   "tipo": 10          // 10, 11 o 15
 * }
 *
 * Lógica para nota individual (tipo 10/11):
 *   1. Validar que sea tipo 10/11 y statusentrega=PENDIENTE
 *   2. Descontar pedido de stock del cdentrega
 *   3. UPDATE statusentrega = 'ENTREGADO'
 *
 * Lógica para nota agrupada (tipo 15):
 *   1. Validar que sea tipo 15 y statusentrega=PENDIENTE
 *   2. Leer num_grupo de transaccion_adicionales
 *   3. Descontar pedido de la nota 15 (totales acumulados) de stock del cdentrega
 *   4. UPDATE statusentrega = 'ENTREGADO' en la nota 15
 *   5. UPDATE statusentrega = 'ENTREGADO' en todas las notas individuales del grupo
 */
require_once __DIR__ . '/../../config.php';
auth();
$db = getDB();

$b    = json_decode(file_get_contents('php://input'), true) ?? [];
$idTx = (int)($b['idtransacciones'] ?? 0);
$tipo = (int)($b['tipo'] ?? 0);

if ($idTx === 0) {
    jsonErr('Se requiere idtransacciones.');
}

try {
    $db->exec("SET NAMES utf8mb4 COLLATE utf8mb4_general_ci");
    $db->exec("SET CHARACTER SET utf8mb4");

    // ── Obtener datos de la transacción ─────────────────────────────────────
    $stmtTx = $db->prepare("
        SELECT idtransacciones, tipostr_idtipostr AS tipo, statusentrega, cdentrega
        FROM transacciones WHERE idtransacciones = ?
    ");
    $stmtTx->execute([$idTx]);
    $tx = $stmtTx->fetch(PDO::FETCH_ASSOC);

    if (!$tx) {
        jsonErr("Transacción #$idTx no encontrada.");
    }
    if ($tx['statusentrega'] !== 'PENDIENTE') {
        jsonErr("La transacción #$idTx no tiene statusentrega=PENDIENTE (actual: {$tx['statusentrega']}).");
    }

    $tipoTx    = (int)$tx['tipo'];
    $cdentrega = (int)$tx['cdentrega'];

    if (!in_array($tipoTx, [10, 11, 15])) {
        jsonErr("La transacción #$idTx no es tipo 10, 11 o 15.");
    }

    $db->beginTransaction();

    // ── Obtener productos a descontar ────────────────────────────────────────
    // Para tipo 10/11 y 15: se usa la tabla pedido de la nota misma
    // (para tipo 15 ya tiene los totales acumulados de todas las notas del grupo)
    $stmtPed = $db->prepare("
        SELECT productos_idprod AS id_prod, cant
        FROM pedido
        WHERE transacciones_idtransacciones = ?
    ");
    $stmtPed->execute([$idTx]);
    $productos = $stmtPed->fetchAll(PDO::FETCH_ASSOC);

    if (empty($productos)) {
        $db->rollBack();
        jsonErr("La transacción #$idTx no tiene productos en tabla pedido.");
    }

    // ── Descontar stock ──────────────────────────────────────────────────────
    $stmtStock = $db->prepare("
        UPDATE stock SET cantidad = cantidad - ?
        WHERE idcd = ? AND idprod = ?
    ");
    foreach ($productos as $p) {
        $stmtStock->execute([(int)$p['cant'], $cdentrega, (int)$p['id_prod']]);
    }

    // ── UPDATE statusentrega = ENTREGADO en la nota principal ────────────────
    $db->prepare("UPDATE transacciones SET statusentrega = 'ENTREGADO' WHERE idtransacciones = ?")
       ->execute([$idTx]);

    // ── Si es tipo 15: también actualizar las notas individuales del grupo ───
    if ($tipoTx === 15) {
        // Obtener num_grupo
        $stmtGrupo = $db->prepare("
            SELECT COALESCE(num_grupo, 0) FROM transaccion_adicionales WHERE idtransacciones = ?
        ");
        $stmtGrupo->execute([$idTx]);
        $numGrupo = (int)$stmtGrupo->fetchColumn();

        if ($numGrupo > 0) {
            $stmtIds = $db->prepare("
                SELECT id_transacciones FROM pedido_agrupado WHERE num_grupo = ?
            ");
            $stmtIds->execute([$numGrupo]);
            $idsIndividuales = $stmtIds->fetchAll(PDO::FETCH_COLUMN);

            if (!empty($idsIndividuales)) {
                $ph = implode(',', array_fill(0, count($idsIndividuales), '?'));
                $db->prepare("
                    UPDATE transacciones SET statusentrega = 'ENTREGADO'
                    WHERE idtransacciones IN ($ph)
                ")->execute($idsIndividuales);
            }
        }
    }

    $db->commit();

    // Obtener nombres de los productos descontados
    $stmtNombres = $db->prepare("
        SELECT p.productos_idprod AS id_prod, p.cant,
               COALESCE(pr.nombreProd, pm.promodesc, CONCAT('ID:',p.productos_idprod)) AS nombre
        FROM pedido p
        LEFT JOIN productos pr ON pr.id_prod = p.productos_idprod AND p.productos_idprod < 1000
        LEFT JOIN promod pm    ON pm.id_promo = p.productos_idprod AND p.productos_idprod >= 1000
        WHERE p.transacciones_idtransacciones = ?
    ");
    $stmtNombres->execute([$idTx]);
    $prodsDesc = $stmtNombres->fetchAll(PDO::FETCH_ASSOC);

    jsonOk([
        'idtransacciones'       => $idTx,
        'tipo'                  => $tipoTx,
        'statusentrega'         => 'ENTREGADO',
        'productos_descontados' => $prodsDesc,
    ]);

} catch (Exception $e) {
    if ($db->inTransaction()) $db->rollBack();
    jsonErr('Error al confirmar entrega: ' . $e->getMessage());
}
