<?php
/**
 * crear-voucher.php
 * Crea un voucher a partir de una ganancia (registro en regs2) con status=0 (Por Pagar).
 *
 * Método: POST
 * Body JSON: { "idreg": 123, "monto": 500.00 }
 * Auth: Bearer token (admin_sessions)
 *
 * Lógica:
 *  - Genera el idv y consec usando: max(consec) + 2 dígitos aleatorios
 *  - Inserta en voucher: id_inv, total, restante, status=0, idcd=1,
 *    referencia=idreg, fecha_cre, fecha_mod, consec, descripcion, creado_por
 *  - Actualiza regs2:
 *    · Si monto == apagar: apagar=0, status=5, observaciones += "Voucher #idv"
 *    · Si monto < apagar:  apagar -= monto, status=0, observaciones += "Voucher #idv"
 */

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: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../../config.php';

// ── Autenticación admin ─────────────────────────────────────────────────────
function getAdminToken(): string {
    $h = '';
    if (!empty($_SERVER['HTTP_AUTHORIZATION']))          $h = $_SERVER['HTTP_AUTHORIZATION'];
    elseif (!empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) $h = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
    elseif (function_exists('getallheaders')) {
        $hdrs = getallheaders();
        $h = $hdrs['Authorization'] ?? $hdrs['authorization'] ?? '';
    }
    if (!$h && !empty($_SERVER['Authorization'])) $h = $_SERVER['Authorization'];
    return $h;
}

$authHeader = getAdminToken();
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Token requerido']);
    exit;
}
$adminToken = trim($m[1]);
$db  = getDB();
$now = date('Y-m-d H:i:s');

// Verificar sesión admin
$stmtSess = $db->prepare(
    "SELECT s.idusuarios_sist FROM admin_sessions s
     WHERE s.token = ? AND s.expira > ? LIMIT 1"
);
$stmtSess->execute([$adminToken, $now]);
if (!$stmtSess->fetch()) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Sesión expirada o inválida']);
    exit;
}

// ── Validar método y parámetros ─────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Método no permitido']);
    exit;
}

$body  = json_decode(file_get_contents('php://input'), true);
$idreg = isset($body['idreg']) ? (int)$body['idreg'] : 0;
$monto = isset($body['monto']) ? (float)$body['monto'] : 0;

if ($idreg <= 0 || $monto <= 0) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'idreg y monto son requeridos y deben ser positivos']);
    exit;
}

// ── Obtener el registro de regs2 ────────────────────────────────────────────
$stmtReg = $db->prepare(
    "SELECT r.idreg, r.id_inver, r.apagar, r.status, r.observaciones
     FROM regs2 r
     WHERE r.idreg = ? LIMIT 1"
);
$stmtReg->execute([$idreg]);
$reg = $stmtReg->fetch(PDO::FETCH_ASSOC);

if (!$reg) {
    http_response_code(404);
    echo json_encode(['success' => false, 'message' => 'Registro de ganancia no encontrado']);
    exit;
}

if ((int)$reg['status'] !== 0) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Solo se pueden crear vouchers para registros con status "Por Pagar" (0)']);
    exit;
}

$apagar = (float)$reg['apagar'];

if ($monto > $apagar) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => "El monto ($monto) no puede ser mayor al saldo a pagar ($apagar)"]);
    exit;
}

// ── Generar consec e idv ────────────────────────────────────────────────────
// Lógica original: $nvov = max(consec) . rand(0,9) . rand(0,9)
// El idv se construye igual que $nvov (consec + 2 dígitos aleatorios)
$stmtConsec = $db->query("SELECT COALESCE(MAX(consec), 0) as mc FROM voucher");
$maxConsec  = (int)$stmtConsec->fetch(PDO::FETCH_ASSOC)['mc'];
$nuevoConsec = $maxConsec + 1;

$randi1 = rand(0, 9);
$randi2 = rand(0, 9);
$idv    = (int)($nuevoConsec . $randi1 . $randi2);

// ── Datos del voucher ───────────────────────────────────────────────────────
$fechaHoy   = date('Y-m-d');
$fechaHora  = date('d/m/Y \a \l\a\s h:i:sa');
$descripcion = "Este voucher ha sido generado el $fechaHora por Admin";

// ── Insertar en voucher ─────────────────────────────────────────────────────
$stmtInsert = $db->prepare(
    "INSERT INTO voucher
        (idv, id_inv, total, restante, status, idcd, referencia,
         observaciones, descripcion, fecha_cre, fecha_mod, creado_por, consec)
     VALUES
        (?, ?, ?, ?, 0, 1, ?,
         '', ?, ?, NOW(), 'Admin', ?)"
);
$stmtInsert->execute([
    $idv,
    (int)$reg['id_inver'],
    $monto,
    $monto,
    (string)$idreg,          // referencia = idreg de regs2
    $descripcion,
    $fechaHoy,
    $nuevoConsec
]);

// ── Actualizar regs2 ────────────────────────────────────────────────────────
$obsActual = trim($reg['observaciones'] ?? '');
$obsNueva  = $obsActual ? "$obsActual | Voucher #$idv" : "Voucher #$idv";

if (abs($monto - $apagar) < 0.01) {
    // Monto igual al saldo: cerrar completamente
    $nuevoApagar = 0;
    $nuevoStatus = 5; // Voucher
} else {
    // Monto parcial: restar y mantener Por Pagar
    $nuevoApagar = round($apagar - $monto, 2);
    $nuevoStatus = 0;
}

$stmtUpdate = $db->prepare(
    "UPDATE regs2
     SET apagar = ?, status = ?, observaciones = ?
     WHERE idreg = ?"
);
$stmtUpdate->execute([$nuevoApagar, $nuevoStatus, $obsNueva, $idreg]);

// ── Respuesta ───────────────────────────────────────────────────────────────
echo json_encode([
    'success'       => true,
    'message'       => 'Voucher creado correctamente',
    'idv'           => $idv,
    'consec'        => $nuevoConsec,
    'monto_voucher' => $monto,
    'nuevo_apagar'  => $nuevoApagar,
    'nuevo_status'  => $nuevoStatus,
    'observaciones' => $obsNueva,
], JSON_UNESCAPED_UNICODE);
