"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const core = __importStar(require("@actions/core"));
const github = __importStar(require("@actions/github"));
const xmlbuilder = __importStar(require("xmlbuilder"));
const xmlParser = __importStar(require("fast-xml-parser"));
function configAuthentication(feedUrl, existingFileLocation = '') {
    const existingNuGetConfig = path.resolve(process.env['RUNNER_TEMP'] || process.cwd(), existingFileLocation == '' ? 'nuget.config' : existingFileLocation);
    const tempNuGetConfig = path.resolve(process.env['RUNNER_TEMP'] || process.cwd(), '../', 'nuget.config');
    writeFeedToFile(feedUrl, existingNuGetConfig, tempNuGetConfig);
}
exports.configAuthentication = configAuthentication;
function writeFeedToFile(feedUrl, existingFileLocation, tempFileLocation) {
    console.log(`dotnet-auth: Finding any source references in ${existingFileLocation}, writing a new temporary configuration file with credentials to ${tempFileLocation}`);
    let xml;
    let sourceKeys = [];
    let owner = core.getInput('owner');
    let sourceUrl = feedUrl;
    if (!owner) {
        owner = github.context.repo.owner;
    }
    if (feedUrl.indexOf('nuget.pkg.github.com') > -1) {
        sourceUrl = 'https://nuget.pkg.github.com/' + owner + '/index.json';
    }
    if (!process.env.NUGET_AUTH_TOKEN || process.env.NUGET_AUTH_TOKEN == '') {
        throw new Error('The NUGET_AUTH_TOKEN environment variable was not provided. In this step, add the following: \r\nenv:\r\n  NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}');
    }
    if (fs.existsSync(existingFileLocation)) {
        // get key from existing NuGet.config so NuGet/dotnet can match credentials
        const curContents = fs.readFileSync(existingFileLocation, 'utf8');
        var json = xmlParser.parse(curContents, { ignoreAttributes: false });
        if (typeof json.configuration == 'undefined') {
            throw new Error(`The provided NuGet.config seems invalid.`);
        }
        if (typeof json.configuration.packageSources != 'undefined') {
            if (typeof json.configuration.packageSources.add != 'undefined') {
                // file has at least one <add>
                if (typeof json.configuration.packageSources.add[0] == 'undefined') {
                    // file has only one <add>
                    if (json.configuration.packageSources.add['@_value']
                        .toLowerCase()
                        .includes(feedUrl.toLowerCase())) {
                        let key = json.configuration.packageSources.add['@_key'];
                        sourceKeys.push(key);
                        core.debug(`Found a URL with key ${key}`);
                    }
                }
                else {
                    // file has 2+ <add>
                    for (let i = 0; i < json.configuration.packageSources.add.length; i++) {
                        core.debug(json.configuration.packageSources.add[i]);
                        if (json.configuration.packageSources.add[i]['@_value']
                            .toLowerCase()
                            .includes(feedUrl.toLowerCase())) {
                            let key = json.configuration.packageSources.add[i]['@_key'];
                            sourceKeys.push(key);
                            core.debug(`Found a URL with key ${key}`);
                        }
                    }
                }
            }
        }
    }
    xml = xmlbuilder
        .create('configuration')
        .ele('config')
        .ele('add', { key: 'defaultPushSource', value: sourceUrl })
        .up()
        .up();
    if (sourceKeys.length == 0) {
        let keystring = 'Source';
        xml = xml
            .ele('packageSources')
            .ele('add', { key: keystring, value: sourceUrl })
            .up()
            .up();
        sourceKeys.push(keystring);
    }
    xml = xml.ele('packageSourceCredentials');
    sourceKeys.forEach(key => {
        if (key.indexOf(' ') > -1) {
            throw new Error("This action currently can't handle source names with spaces. Remove the space from your repo's NuGet.config and try again.");
        }
        xml = xml
            .ele(key)
            .ele('add', { key: 'Username', value: owner })
            .up()
            .ele('add', {
            key: 'ClearTextPassword',
            value: process.env.NUGET_AUTH_TOKEN
        })
            .up()
            .up();
    });
    // If NuGet fixes itself such that on Linux it can look for environment variables in the config file (it doesn't seem to work today),
    // use this for the value above
    //           process.platform == 'win32'
    //             ? '%NUGET_AUTH_TOKEN%'
    //             : '$NUGET_AUTH_TOKEN'
    var output = xml.end({ pretty: true });
    fs.writeFileSync(tempFileLocation, output);
}
