"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var core = require('@actions/core');
var jp = require('jsonpath');
var xpath = require('xpath');
var domParser = require('xmldom').DOMParser;
var FormatType;
(function (FormatType) {
    FormatType[FormatType["JSON"] = 0] = "JSON";
    FormatType[FormatType["XML"] = 1] = "XML";
})(FormatType = exports.FormatType || (exports.FormatType = {}));
/**
 * Takes content as string and format type (xml, json).
 * Exposes getSecret method to get value of specific secret in object and set it as secret.
 */
class SecretParser {
    constructor(content, contentType) {
        switch (contentType) {
            case FormatType.JSON:
                try {
                    this.dom = JSON.parse(content);
                }
                catch (ex) {
                    throw new Error('Content is not a valid JSON object');
                }
                break;
            case FormatType.XML:
                try {
                    this.dom = new domParser().parseFromString(content);
                }
                catch (ex) {
                    throw new Error('Content is not a valid XML object');
                }
                break;
            default:
                throw new Error(`Given format: ${contentType} is not supported. Valid options are JSON, XML.`);
        }
        this.contentType = contentType;
    }
    /**
     *
     * @param key jsonpath or xpath depending on content type
     * @param isSecret should the value parsed be a secret. Deafult: true
     * @param variableName optional. If provided value will be exported with this variable name
     * @returns a string value or empty string if key not found
     */
    getSecret(key, isSecret = true, variableName) {
        let value = "";
        switch (this.contentType) {
            case FormatType.JSON:
                value = this.extractJsonPath(key, isSecret, variableName);
                break;
            case FormatType.XML:
                value = this.extractXmlPath(key, isSecret, variableName);
                break;
        }
        return value;
    }
    extractJsonPath(key, isSecret = false, variableName) {
        let value = jp.query(this.dom, key);
        if (value.length == 0) {
            core.debug("Cannot find key: " + key);
            return "";
        }
        else if (value.length > 1) {
            core.debug("Multiple values found for key: " + key + ". Please give jsonPath which points to a single value.");
            return "";
        }
        return this.handleSecret(key, value[0], isSecret, variableName);
    }
    extractXmlPath(key, isSecret = false, variableName) {
        let value = xpath.select("string(" + key + ")", this.dom);
        return this.handleSecret(key, value, isSecret, variableName);
    }
    handleSecret(key, value, isSecret, variableName) {
        if (!!value) {
            if (isSecret) {
                core.setSecret(value);
            }
            if (!!variableName) {
                core.exportVariable(variableName, value);
            }
            return value;
        }
        else {
            core.debug("Cannot find key: " + key);
            return "";
        }
    }
}
exports.SecretParser = SecretParser;
