"use strict";
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Keychain = void 0;
const vscode = require("vscode");
const nls = require("vscode-nls");
const localize = nls.loadMessageBundle();
function getKeytar() {
    try {
        return require('keytar');
    }
    catch (err) {
        console.log(err);
    }
    return undefined;
}
class Keychain {
    constructor(context, serviceId, Logger) {
        this.context = context;
        this.serviceId = serviceId;
        this.Logger = Logger;
    }
    async setToken(token) {
        try {
            return await this.context.secrets.store(this.serviceId, token);
        }
        catch (e) {
            // Ignore
            this.Logger.error(`Setting token failed: ${e}`);
            const troubleshooting = localize('troubleshooting', "Troubleshooting Guide");
            const result = await vscode.window.showErrorMessage(localize('keychainWriteError', "Writing login information to the keychain failed with error '{0}'.", e.message), troubleshooting);
            if (result === troubleshooting) {
                vscode.env.openExternal(vscode.Uri.parse('https://code.visualstudio.com/docs/editor/settings-sync#_troubleshooting-keychain-issues'));
            }
        }
    }
    async getToken() {
        try {
            const secret = await this.context.secrets.get(this.serviceId);
            if (secret && secret !== '[]') {
                this.Logger.trace('Token acquired from secret storage.');
            }
            return secret;
        }
        catch (e) {
            // Ignore
            this.Logger.error(`Getting token failed: ${e}`);
            return Promise.resolve(undefined);
        }
    }
    async deleteToken() {
        try {
            return await this.context.secrets.delete(this.serviceId);
        }
        catch (e) {
            // Ignore
            this.Logger.error(`Deleting token failed: ${e}`);
            return Promise.resolve(undefined);
        }
    }
    async tryMigrate() {
        try {
            const keytar = getKeytar();
            if (!keytar) {
                throw new Error('keytar unavailable');
            }
            const oldValue = await keytar.getPassword(`${vscode.env.uriScheme}-github.login`, 'account');
            if (oldValue) {
                this.Logger.trace('Attempting to migrate from keytar to secret store...');
                await this.setToken(oldValue);
                await keytar.deletePassword(`${vscode.env.uriScheme}-github.login`, 'account');
            }
            return oldValue;
        }
        catch (_) {
            // Ignore
            return Promise.resolve(undefined);
        }
    }
}
exports.Keychain = Keychain;
//# sourceMappingURL=keychain.js.map