"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _export(target, all) {
    for(var name in all)Object.defineProperty(target, name, {
        enumerable: true,
        get: all[name]
    });
}
_export(exports, {
    getExpoGoVersionEntryAsync: ()=>getExpoGoVersionEntryAsync,
    downloadExpoGoAsync: ()=>downloadExpoGoAsync
});
function _getUserState() {
    const data = require("@expo/config/build/getUserState");
    _getUserState = function() {
        return data;
    };
    return data;
}
function _path() {
    const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
    _path = function() {
        return data;
    };
    return data;
}
function _semver() {
    const data = require("semver");
    _semver = function() {
        return data;
    };
    return data;
}
const _downloadAppAsync = require("./downloadAppAsync");
const _errors = require("./errors");
const _ora = require("./ora");
const _profile = require("./profile");
const _progress = require("./progress");
const _getVersions = require("../api/getVersions");
const _log = require("../log");
function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {
        default: obj
    };
}
const debug = require("debug")("expo:utils:downloadExpoGo");
const platformSettings = {
    ios: {
        versionsKey: "iosClientUrl",
        getFilePath: (filename)=>_path().default.join((0, _getUserState().getExpoHomeDirectory)(), "ios-simulator-app-cache", `${filename}.app`),
        shouldExtractResults: true
    },
    android: {
        versionsKey: "androidClientUrl",
        getFilePath: (filename)=>_path().default.join((0, _getUserState().getExpoHomeDirectory)(), "android-apk-cache", `${filename}.apk`),
        shouldExtractResults: false
    }
};
async function getExpoGoVersionEntryAsync(sdkVersion) {
    const { sdkVersions: versions  } = await (0, _getVersions.getVersionsAsync)();
    let version;
    if (sdkVersion.toUpperCase() === "UNVERSIONED") {
        // find the latest version
        const latestVersionKey = Object.keys(versions).reduce((a, b)=>{
            if ((0, _semver().gt)(b, a)) {
                return b;
            }
            return a;
        }, "0.0.0");
        _log.Log.warn(`Downloading the latest Expo Go client (${latestVersionKey}). This will not fully conform to UNVERSIONED.`);
        version = versions[latestVersionKey];
    } else {
        version = versions[sdkVersion];
    }
    if (!version) {
        throw new _errors.CommandError(`Unable to find a version of Expo Go for SDK ${sdkVersion}`);
    }
    return version;
}
async function downloadExpoGoAsync(platform, { url , sdkVersion  }) {
    const { getFilePath , versionsKey , shouldExtractResults  } = platformSettings[platform];
    const spinner = (0, _ora.ora)({
        text: "Fetching Expo Go",
        color: "white"
    }).start();
    let bar = null;
    try {
        if (!url) {
            const version = await getExpoGoVersionEntryAsync(sdkVersion);
            debug(`Installing Expo Go version for SDK ${sdkVersion} at URL: ${version[versionsKey]}`);
            url = version[versionsKey];
        }
    } catch (error) {
        spinner.fail();
        throw error;
    }
    const filename = _path().default.parse(url).name;
    try {
        const outputPath = getFilePath(filename);
        debug(`Downloading Expo Go from "${url}" to "${outputPath}".`);
        debug(`The requested copy of Expo Go might already be cached in: "${(0, _getUserState().getExpoHomeDirectory)()}". You can disable the cache with EXPO_NO_CACHE=1`);
        await (0, _profile.profile)(_downloadAppAsync.downloadAppAsync)({
            url,
            // Save all encrypted cache data to `~/.expo/expo-go`
            cacheDirectory: "expo-go",
            outputPath,
            extract: shouldExtractResults,
            onProgress ({ progress , total  }) {
                if (progress && total) {
                    if (!bar) {
                        if (spinner.isSpinning) {
                            spinner.stop();
                        }
                        bar = (0, _progress.createProgressBar)("Downloading the Expo Go app [:bar] :percent :etas", {
                            width: 64,
                            total: 100,
                            // clear: true,
                            complete: "=",
                            incomplete: " "
                        });
                    } else {
                        bar.update(progress, total);
                    }
                }
            }
        });
        return outputPath;
    } finally{
        spinner.stop();
        // @ts-expect-error
        bar == null ? void 0 : bar.terminate();
    }
}

//# sourceMappingURL=downloadExpoGoAsync.js.map