<?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],
 *   "cdentrega": 3   // requerido si los ids tienen cdentrega diferente
 * }
 */
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) ?? [];
$ids       = array_map('intval', $b['ids'] ?? []);
$cdentrega = (int)($b['cdentrega'] ?? 0);
$cdVenta   = (int)($b['cd_venta']  ?? 0);

if (count($ids) < 2) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'success' => false, 'message' => 'Se requieren al menos 2 notas para agrupar.']);
    exit;
}
if ($cdVenta === 0) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'success' => false, 'message' => 'Se requiere seleccionar el centro que genera la agrupación.']);
    exit;
}

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)) {
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => 'Una o más notas no fueron encontradas.']);
        exit;
    }
    foreach ($notas as $n) {
        if (!in_array((int)$n['tipo'], [10, 11])) {
            http_response_code(400);
            echo json_encode(['ok' => false, 'success' => false, 'message' => "La nota #{$n['idtransacciones']} no es tipo 10 u 11."]);
            exit;
        }
        if ($n['statusentrega'] !== 'PENDIENTE') {
            http_response_code(400);
            echo json_encode(['ok' => false, 'success' => false, 'message' => "La nota #{$n['idtransacciones']} no tiene statusentrega=PENDIENTE."]);
            exit;
        }
    }

    // ── Determinar cdentrega ──────────────────────────────────────────────────
    $cdentregas = array_unique(array_column($notas, 'cdentrega'));
    if (count($cdentregas) === 1) {
        $cdentrega = (int)$cdentregas[0];
    } elseif ($cdentrega === 0) {
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => 'Las notas tienen centros de entrega distintos. Especifique cdentrega.']);
        exit;
    }

    // Validar que cd_venta existe y tiene tipo_usuario 2 o 3
    $stmtCd = $db->prepare("SELECT idusuarios_ci FROM usuarios_ci WHERE idusuarios_ci = ? AND tipo_usuario IN (2,3)");
    $stmtCd->execute([$cdVenta]);
    if (!$stmtCd->fetch()) {
        http_response_code(400);
        echo json_encode(['ok' => false, 'success' => false, 'message' => 'Centro generador inválido.']);
        exit;
    }

    $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 ─────────────────────────────────────────────────
    $pedidoAcum = [];
    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 ─────────────────────────────────────────────
    $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 ────────────────────────────────────
    $stmtUpd = $db->prepare("
        UPDATE transacciones SET statusentrega = 'AGRUPADO'
        WHERE idtransacciones = ?
    ");
    foreach ($ids as $idNota) {
        $stmtUpd->execute([$idNota]);
    }

    $db->commit();

    // Productos acumulados
    $productosGrupo = [];
    foreach ($pedidoAcum as $pid => $data) {
        $productosGrupo[] = ['id_prod' => $pid, 'nombre' => $data['nombre'], 'cant' => $data['cant']];
    }

    // Detalle de notas individuales agrupadas
    $stmtDetalle = $db->prepare("
        SELECT t.idtransacciones, t.fechat,
               CONCAT(i.nombre,' ',i.appat,' ',COALESCE(i.apmat,'')) AS nombre_dist,
               i.referencia
        FROM transacciones t
        JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
        WHERE t.idtransacciones = ?
    ");
    $stmtProdsNota = $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 = ?
    ");
    $notasDetalle = [];
    foreach ($ids as $idNota) {
        $stmtDetalle->execute([$idNota]);
        $nd = $stmtDetalle->fetch(PDO::FETCH_ASSOC);
        if ($nd) {
            $stmtProdsNota->execute([$idNota]);
            $pn = $stmtProdsNota->fetchAll(PDO::FETCH_ASSOC);
            foreach ($pn as &$pp) { $pp['id_prod']=(int)$pp['id_prod']; $pp['cant']=(int)$pp['cant']; }
            unset($pp);
            $nd['idtransacciones'] = (int)$nd['idtransacciones'];
            $nd['productos'] = $pn;
            $notasDetalle[] = $nd;
        }
    }

    // Nombre del centro generador
    $stmtNombreCd = $db->prepare("SELECT nombre FROM usuarios_ci WHERE idusuarios_ci = ?");
    $stmtNombreCd->execute([$cdVenta]);
    $nombreCdVenta = $stmtNombreCd->fetchColumn() ?: "Centro $cdVenta";

    echo json_encode([
        'ok'      => true,
        'success' => true,
        'data'    => [
            'id_grupo_tx'    => $idTx15,
            'num_grupo'      => $numGrupo,
            'cdentrega'      => $cdentrega,
            'cd_venta'       => $cdVenta,
            'nombre_cd_venta'=> $nombreCdVenta,
            'fecha'          => $fecha,
            'total_agrupadas'=> count($ids),
            'productos'      => $productosGrupo,
            'notas'          => $notasDetalle,
        ]
    ]);

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