"use strict";
/**
 * @author NovaStepStudios
 * @alias StepnickaSantiago
 * @license Apache-2.0
 * @link https://www.apache.org/licenses/LICENSE-2.0
 */
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromURL = fromURL;
exports.downloadJSON = downloadJSON;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const https_1 = __importDefault(require("https"));
/**
 * Descarga un archivo desde una URL y lo guarda en la ruta indicada.
 * Crea las carpetas necesarias si no existen.
 * Permite callback de progreso.
 * @param url URL del archivo a descargar
 * @param destination Ruta local donde guardar el archivo
 * @param onProgress Callback opcional: recibe bytes descargados y total
 */
async function fromURL(url, destination, onProgress) {
    return new Promise((resolve, reject) => {
        fs_1.default.promises.mkdir(path_1.default.dirname(destination), { recursive: true })
            .then(() => {
            const file = fs_1.default.createWriteStream(destination);
            https_1.default.get(url, (res) => {
                if (res.statusCode !== 200) {
                    file.close();
                    return reject(new Error(`Error al descargar: HTTP ${res.statusCode} -> ${url}`));
                }
                const totalSize = parseInt(res.headers['content-length'] || '0', 10);
                let downloaded = 0;
                res.on('data', (chunk) => {
                    downloaded += chunk.length;
                    if (onProgress)
                        onProgress(downloaded, totalSize);
                });
                res.pipe(file);
                file.on('finish', () => {
                    file.close();
                    resolve();
                });
                file.on('error', (err) => {
                    file.close();
                    fs_1.default.unlink(destination, () => reject(err));
                });
            }).on('error', (err) => {
                fs_1.default.unlink(destination, () => reject(err));
            });
        })
            .catch(reject);
    });
}
/**
 * Descarga un JSON desde una URL y lo devuelve parseado.
 * @param url URL del JSON
 */
async function downloadJSON(url) {
    return new Promise((resolve, reject) => {
        https_1.default.get(url, (res) => {
            if (res.statusCode !== 200)
                return reject(new Error(`HTTP ${res.statusCode} -> ${url}`));
            let data = '';
            res.on('data', chunk => data += chunk);
            res.on('end', () => {
                try {
                    resolve(JSON.parse(data));
                }
                catch (err) {
                    reject(err);
                }
            });
        }).on('error', reject);
    });
}
