<?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 }
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Authorization, Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); 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;
}

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

if ($idTx === 0) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'success' => false, 'message' => 'Se requiere idtransacciones.']);
    exit;
}

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) {
        http_response_code(404);
        echo json_encode(['ok' => false, 'success' => false, 'message' => "Transacción #$idTx no encontrada."]);
        exit;
    }
    if ($tx['statusentrega'] !== 'PENDIENTE') {
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => "La transacción #$idTx no tiene statusentrega=PENDIENTE (actual: {$tx['statusentrega']})."]);
        exit;
    }

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

    if (!in_array($tipoTx, [10, 11, 15])) {
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => "La transacción #$idTx no es tipo 10, 11 o 15."]);
        exit;
    }

    $db->beginTransaction();

    // ── Obtener productos a descontar ─────────────────────────────────────────
    $stmtPed = $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 = ?
    ");
    $stmtPed->execute([$idTx]);
    $productos = $stmtPed->fetchAll(PDO::FETCH_ASSOC);

    if (empty($productos)) {
        $db->rollBack();
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => "La transacción #$idTx no tiene productos en tabla pedido."]);
        exit;
    }

    // ── 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) {
        $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();

    echo json_encode([
        'ok'      => true,
        'success' => true,
        'data'    => [
            'idtransacciones'       => $idTx,
            'tipo'                  => $tipoTx,
            'statusentrega'         => 'ENTREGADO',
            'productos_descontados' => $productos,
        ]
    ]);

} catch (Exception $e) {
    if ($db->inTransaction()) $db->rollBack();
    http_response_code(500);
    echo json_encode(['ok' => false, 'success' => false, 'message' => 'Error al confirmar entrega: ' . $e->getMessage()]);
}
