"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Uploader = void 0;
const internal_1 = require("./types/internal");
const texts_1 = require("./texts");
class Uploader {
    constructor(readFile, transport, logger) {
        this._transport = transport;
        this._uploads = [];
        this._logger = logger;
        this._readFile = readFile;
    }
    async _getUploadInfo(uploadEntityId) {
        const response = await this._transport.fetchFromDashboard('api/getUploadUrl');
        if (response.ok)
            return await response.json();
        this._logger.error(texts_1.createGetUploadInfoError(uploadEntityId, response.toString()));
        return null;
    }
    async _upload(uploadInfo, uploadEntity, uploadError) {
        const { uploadUrl, uploadId } = uploadInfo;
        const response = await this._transport.fetch(uploadUrl, {
            method: 'PUT',
            headers: {
                'Content-Length': uploadEntity.length
            },
            body: uploadEntity
        });
        await this._transport.sendResolveCommand({
            aggregateId: uploadId,
            aggregateName: internal_1.AggregateNames.Upload,
            type: internal_1.AggregateCommandType.createUpload,
            payload: {
                status: response.ok ? internal_1.UploadStatus.Completed : internal_1.UploadStatus.Failed
            }
        });
        if (!response.ok)
            this._logger.error(`${uploadError}. Response: ${response}`);
    }
    async uploadFile(filePath) {
        const uploadInfo = await this._getUploadInfo(filePath);
        if (!uploadInfo)
            return void 0;
        let file = null;
        try {
            file = await this._readFile(filePath);
        }
        catch (e) {
            this._logger.error(e.message);
            return void 0;
        }
        this._uploads.push(this._upload(uploadInfo, file, texts_1.createFileUploadError(uploadInfo.uploadId, filePath)));
        return uploadInfo.uploadId;
    }
    requestUploadEntity(uploadInfo, uploadObject, error) {
        const buffer = Buffer.from(JSON.stringify(uploadObject, (key, value) => value instanceof RegExp ? value.toString() : value));
        this._uploads.push(this._upload(uploadInfo, buffer, error));
    }
    async uploadTest(uploadEntityId, testRunInfo) {
        const uploadInfo = await this._getUploadInfo(uploadEntityId);
        if (!uploadInfo)
            return void 0;
        this.requestUploadEntity(uploadInfo, testRunInfo, texts_1.createTestUploadError(uploadInfo.uploadId, uploadEntityId));
        return uploadInfo.uploadId;
    }
    async uploadRunWarning(uploadEntityId, warningInfo) {
        const uploadInfo = await this._getUploadInfo(uploadEntityId);
        if (!uploadInfo)
            return void 0;
        this.requestUploadEntity(uploadInfo, warningInfo, texts_1.createWarningUploadError(uploadInfo.uploadId, uploadEntityId));
        return uploadInfo.uploadId;
    }
    async waitUploads() {
        await Promise.all(this._uploads);
    }
}
exports.Uploader = Uploader;