<?php
/**
 * agrupacion-crear.php
 * Crea una nota tipo 15 (agrupación) a partir de notas tipo 10/11 con statusentrega=PENDIENTE.
 *
 * POST body (JSON):
 * {
 *   "ids":        [101, 102, 103],   // idtransacciones de las notas a agrupar
 *   "cdentrega":  3                  // centro de entrega elegido (requerido si los ids tienen cdentrega diferente)
 * }
 *
 * Lógica:
 *   1. Validar que todas las notas sean tipo 10/11 y statusentrega=PENDIENTE
 *   2. Obtener MAX(num_grupo) de pedido_agrupado → nuevo_num_grupo = MAX + 1
 *   3. Obtener siguiente consec para el centro de venta (cdentrega)
 *   4. INSERT transacciones tipo 15
 *   5. INSERT pedido (suma de productos de todas las notas, agrupados por id_prod)
 *   6. INSERT transaccion_adicionales con num_grupo
 *   7. INSERT pedido_agrupado (un registro por nota individual)
 *   8. UPDATE transacciones SET statusentrega='AGRUPADO' para las notas individuales
 */
require_once __DIR__ . '/../../config.php';
auth();
$db = getDB();

$b        = json_decode(file_get_contents('php://input'), true) ?? [];
$ids      = array_map('intval', $b['ids'] ?? []);
$cdentrega = (int)($b['cdentrega'] ?? 0);

if (count($ids) < 2) {
    jsonErr('Se requieren al menos 2 notas para agrupar.');
}

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

    // ── 1. Validar notas ────────────────────────────────────────────────────
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $stmtVal = $db->prepare("
        SELECT idtransacciones, tipostr_idtipostr AS tipo, statusentrega, cdentrega,
               inversionista_id_inver, usuarios_ci_idusuarios_ci
        FROM transacciones
        WHERE idtransacciones IN ($placeholders)
    ");
    $stmtVal->execute($ids);
    $notas = $stmtVal->fetchAll(PDO::FETCH_ASSOC);

    if (count($notas) !== count($ids)) {
        jsonErr('Una o más notas no fueron encontradas.');
    }
    foreach ($notas as $n) {
        if (!in_array((int)$n['tipo'], [10, 11])) {
            jsonErr("La nota #{$n['idtransacciones']} no es tipo 10 u 11.");
        }
        if ($n['statusentrega'] !== 'PENDIENTE') {
            jsonErr("La nota #{$n['idtransacciones']} no tiene statusentrega=PENDIENTE.");
        }
    }

    // ── Determinar cdentrega ────────────────────────────────────────────────
    $cdentregas = array_unique(array_column($notas, 'cdentrega'));
    if (count($cdentregas) === 1) {
        $cdentrega = (int)$cdentregas[0]; // todos iguales, usar automáticamente
    } elseif ($cdentrega === 0) {
        jsonErr('Las notas tienen centros de entrega distintos. Especifique cdentrega.');
    }

    // Usar el cd del primer usuario como cd_venta de la nota 15
    $cdVenta = (int)$notas[0]['usuarios_ci_idusuarios_ci'];

    $db->beginTransaction();

    // ── 2. Nuevo num_grupo ──────────────────────────────────────────────────
    $maxGrupo = (int)$db->query("SELECT COALESCE(MAX(num_grupo),0) FROM pedido_agrupado")->fetchColumn();
    $numGrupo = $maxGrupo + 1;

    // ── 3. Consec ───────────────────────────────────────────────────────────
    $stmtConsec = $db->prepare("
        INSERT INTO cdconsec (idcd, consec) VALUES (?, 1)
        ON DUPLICATE KEY UPDATE consec = consec + 1
    ");
    $stmtConsec->execute([$cdVenta]);
    $consec = (int)$db->query("SELECT consec FROM cdconsec WHERE idcd = $cdVenta")->fetchColumn();

    // ── 4. INSERT transacciones tipo 15 ─────────────────────────────────────
    $fecha = date('Y-m-d');
    $hora  = date('H:i:s');
    $stmtTx = $db->prepare("
        INSERT INTO transacciones
            (inversionista_id_inver, tipostr_idtipostr, fechat, horat,
             usuarios_ci_idusuarios_ci, consec, cdentrega, statusentrega)
        VALUES (0, 15, ?, ?, ?, ?, ?, 'PENDIENTE')
    ");
    $stmtTx->execute([$fecha, $hora, $cdVenta, $consec, $cdentrega]);
    $idTx15 = (int)$db->lastInsertId();

    // ── 5. Acumular productos de todas las notas (tabla pedido) ─────────────
    $pedidoAcum = []; // [id_prod => ['cant'=>x, 'nombre'=>y]]
    foreach ($ids as $idNota) {
        $stmtPed = $db->prepare("
            SELECT p.productos_idprod AS id_prod, p.cant,
                   COALESCE(pr.nombreProd, pm.promodesc, 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([$idNota]);
        $rows = $stmtPed->fetchAll(PDO::FETCH_ASSOC);
        foreach ($rows as $row) {
            $pid = (int)$row['id_prod'];
            if (!isset($pedidoAcum[$pid])) {
                $pedidoAcum[$pid] = ['cant' => 0, 'nombre' => $row['nombre']];
            }
            $pedidoAcum[$pid]['cant'] += (int)$row['cant'];
        }
    }

    $stmtInsertPed = $db->prepare("
        INSERT INTO pedido (transacciones_idtransacciones, productos_idprod, cant)
        VALUES (?, ?, ?)
    ");
    foreach ($pedidoAcum as $pid => $data) {
        $stmtInsertPed->execute([$idTx15, $pid, $data['cant']]);
    }

    // ── 6. INSERT transaccion_adicionales con num_grupo ─────────────────────
    $stmtAd = $db->prepare("
        INSERT INTO transaccion_adicionales
            (idtransacciones, fuente, id_direccionenvio, costoEnvio,
             confirmaDeposito, metodoPago, telefono, num_grupo)
        VALUES (?, '15', 0, 0, 0, '', '', ?)
    ");
    $stmtAd->execute([$idTx15, $numGrupo]);

    // ── 7. INSERT pedido_agrupado (un registro por nota individual) ──────────
    $stmtAgrp = $db->prepare("
        INSERT INTO pedido_agrupado (num_grupo, id_transacciones, fecha_agrupacion)
        VALUES (?, ?, NOW())
    ");
    foreach ($ids as $idNota) {
        $stmtAgrp->execute([$numGrupo, $idNota]);
    }

    // ── 8. UPDATE statusentrega = 'AGRUPADO' en notas individuales ───────────
    $stmtUpd = $db->prepare("
        UPDATE transacciones SET statusentrega = 'AGRUPADO'
        WHERE idtransacciones = ?
    ");
    foreach ($ids as $idNota) {
        $stmtUpd->execute([$idNota]);
    }

    $db->commit();

    // Resumen de productos del grupo
    $productosGrupo = [];
    foreach ($pedidoAcum as $pid => $data) {
        $productosGrupo[] = [
            'id_prod' => $pid,
            'nombre'  => $data['nombre'],
            'cant'    => $data['cant'],
        ];
    }

    jsonOk([
        'id_grupo_tx' => $idTx15,
        'num_grupo'   => $numGrupo,
        'cdentrega'   => $cdentrega,
        'notas'       => count($ids),
        'productos'   => $productosGrupo,
    ]);

} catch (Exception $e) {
    if ($db->inTransaction()) $db->rollBack();
    jsonErr('Error al crear agrupación: ' . $e->getMessage());
}
