<?php
declare(strict_types=1);
require_once dirname(__FILE__) . '/../config.php';

/**
 * GET /voucher/list.php?id_inv=456
 *
 * Devuelve dos listas:
 *  - disponibles: vouchers con status=0 y restante>0 del usuario
 *  - historial:   todos los vouchers del usuario con las transacciones donde fueron usados
 *
 * Respuesta:
 * {
 *   "success": true,
 *   "data": {
 *     "disponibles": [
 *       { "idv": 123, "total": 500, "restante": 300, "fecha_cre": "2026-01-15" }
 *     ],
 *     "historial": [
 *       {
 *         "idv": 123, "total": 500, "restante": 300, "status": 0, "fecha_cre": "2026-01-15",
 *         "usos": [
 *           { "idtransacciones": 380835, "efectivo": 200 }
 *         ]
 *       }
 *     ]
 *   }
 * }
 */

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    jsonErr(405, 'Método no permitido.');
}

$idInv = isset($_GET['id_inv']) ? (int)$_GET['id_inv'] : 0;
if ($idInv <= 0) {
    jsonErr(400, 'id_inv requerido.');
}

try {
    $db = getDB();

    // 1. Vouchers disponibles (status=0, restante>0)
    $stmtDisp = $db->prepare(
        'SELECT idv, total, restante, fecha_cre
         FROM voucher
         WHERE id_inv = ? AND status = 0 AND restante > 0
         ORDER BY fecha_cre DESC'
    );
    $stmtDisp->execute([$idInv]);
    $disponibles = $stmtDisp->fetchAll();

    // Formatear tipos
    $disponibles = array_map(fn($r) => [
        'idv'      => (int)$r['idv'],
        'total'    => (float)$r['total'],
        'restante' => (float)$r['restante'],
        'fecha_cre'=> $r['fecha_cre'],
    ], $disponibles);

    // 2. Historial completo de vouchers del usuario
    $stmtHist = $db->prepare(
        'SELECT idv, total, restante, status, descripcion,
                DATE_FORMAT(fecha_cre, \'%d/%m/%Y\') AS fecha_cre
         FROM voucher
         WHERE id_inv = ?
         ORDER BY fecha_cre DESC
         LIMIT 50'
    );
    $stmtHist->execute([$idInv]);
    $historial = $stmtHist->fetchAll();

    // Para cada voucher del historial, obtener sus usos en asignavoucher
    $stmtUsos = $db->prepare(
        'SELECT a.idtransacciones, a.efectivo,
                DATE_FORMAT(dt.fecha, \'%d/%m/%Y\') AS fecha
         FROM asignavoucher a
         LEFT JOIN depositos_transaccion dt ON dt.id_voucher = a.idv AND dt.idtransacciones = a.idtransacciones AND dt.tipo = 4
         WHERE a.idv = ?
         ORDER BY a.idtransacciones DESC'
    );

    $historialFinal = [];
    foreach ($historial as $v) {
        $stmtUsos->execute([(int)$v['idv']]);
        $usos = $stmtUsos->fetchAll();
        $historialFinal[] = [
            'idv'        => (int)$v['idv'],
            'total'      => (float)$v['total'],
            'restante'   => (float)$v['restante'],
            'status'     => (int)$v['status'],
            'descripcion'=> $v['descripcion'] ?? '',
            'fecha_cre'  => $v['fecha_cre'],
            'usos'       => array_map(fn($u) => [
                'idtransacciones' => (int)$u['idtransacciones'],
                'efectivo'        => (float)$u['efectivo'],
                'fecha'           => $u['fecha'] ?? '',
            ], $usos),
        ];
    }

    jsonOk([
        'disponibles' => $disponibles,
        'todos'       => $historialFinal,
    ]);

} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Error interno: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE);
    exit;
}
