"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseApi = void 0;
const OpenApiError_1 = require("../api/OpenApiError");
class BaseApi {
    /** Die URL des Servers. Alle Pfadangaben sind relativ zu dieser URL. */
    url;
    /** Der Anmeldename beim Server */
    username;
    /** Der Default-RequestInit für einen Fetch */
    #requestinit = {
        cache: 'no-cache',
        credentials: 'same-origin'
    };
    /** Die Default-Header-Einträge */
    #headers = {};
    /**
     * Erstellt eine neue API mit der übergebenen Konfiguration.
     *
     * @param {string} url - die URL des Servers: Alle Pfadangaben sind relativ zu dieser URL
     * @param {string} username - der Benutzername für den API-Zugriff
     * @param {string} password - das Kennwort des Benutzers für den API-Zugriff
     */
    constructor(url, username, password) {
        this.url = url;
        this.username = username;
        this.#headers["Authorization"] = "Basic " + btoa(username + ":" + password);
    }
    #getURL(path) {
        return this.url + path;
    }
    async #getBinary(path, mimetype) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Accept"] = mimetype;
        requestInit.body = null;
        requestInit.method = 'GET';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for GET: ' + path);
            return await response.blob();
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for GET: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    getPDF(path) {
        return this.#getBinary(path, 'application/pdf');
    }
    async #getTextBased(path, mimetype) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Accept"] = mimetype;
        requestInit.body = null;
        requestInit.method = 'GET';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for GET: ' + path);
            return await response.text();
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for GET: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    getText(path) {
        return this.#getTextBased(path, 'text/plain');
    }
    getJSON(path) {
        return this.#getTextBased(path, 'application/json');
    }
    async #postTextBased(path, mimetype_send, mimetype_receive, body) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Content-Type"] = mimetype_send;
        requestInit.headers["Accept"] = mimetype_receive;
        requestInit.body = body;
        requestInit.method = 'POST';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for POST: ' + path);
            return await response.text();
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for POST: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    postText(path, body) {
        return this.#postTextBased(path, 'text/plain', 'text/plain', body);
    }
    postJSON(path, body) {
        return this.#postTextBased(path, 'application/json', 'application/json', body);
    }
    async #patchTextBased(path, mimetype, body) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Content-Type"] = mimetype;
        requestInit.body = body;
        requestInit.method = 'PATCH';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for PATCH: ' + path);
            return;
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for PATCH: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    patchText(path, body) {
        return this.#patchTextBased(path, 'text/plain', body);
    }
    patchJSON(path, body) {
        return this.#patchTextBased(path, 'application/json', body);
    }
    async #putTextBased(path, mimetype, body) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Content-Type"] = mimetype;
        requestInit.body = body;
        requestInit.method = 'PUT';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for PUT: ' + path);
            return;
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for PUT: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    putText(path, body) {
        return this.#putTextBased(path, 'text/plain', body);
    }
    putJSON(path, body) {
        return this.#putTextBased(path, 'application/json', body);
    }
    async #deleteTextBased(path, mimetype) {
        let requestInit = { ...this.#requestinit };
        requestInit.headers = { ...this.#headers };
        requestInit.headers["Accept"] = mimetype;
        requestInit.body = null;
        requestInit.method = 'DELETE';
        try {
            const response = await fetch(this.#getURL(path), requestInit);
            if (!response.ok)
                throw new OpenApiError_1.OpenApiError(response, 'Fetch failed for DELETE: ' + path);
            return;
        }
        catch (e) {
            if (e instanceof Error)
                throw (e instanceof OpenApiError_1.OpenApiError) ? e : new OpenApiError_1.OpenApiError(e, 'Fetch failed for DELETE: ' + path);
            throw new Error("Unexpected Error: " + e);
        }
    }
    deleteText(path) {
        return this.#deleteTextBased(path, 'text/plain');
    }
    deleteJSON(path) {
        return this.#deleteTextBased(path, 'application/json');
    }
}
exports.BaseApi = BaseApi;
//# sourceMappingURL=BaseApi.js.map