import computeMd5 from 'blueimp-md5';
import Constants from 'expo-constants';
import * as FileSystem from 'expo-file-system';
import { NativeModulesProxy } from 'expo-modules-core';
import { getManifestBaseUrl } from './AssetUris';
// Constants.appOwnership is only available in managed apps (Expo client and standalone)
export const IS_MANAGED_ENV = !!Constants.appOwnership;
// In the future (SDK38+) expo-updates is likely to be used in managed apps, so we decide
// that you are in a bare app with updates if you're not in a managed app and you have
// local assets available.
export const IS_BARE_ENV_WITH_UPDATES = !IS_MANAGED_ENV &&
    !!NativeModulesProxy.ExpoUpdates?.isEnabled &&
    // if expo-updates is installed but we're running directly from the embedded bundle, we don't want
    // to override the AssetSourceResolver
    !NativeModulesProxy.ExpoUpdates?.isUsingEmbeddedAssets;
export const IS_ENV_WITH_UPDATES_ENABLED = IS_MANAGED_ENV || IS_BARE_ENV_WITH_UPDATES;
// If it's not managed or bare w/ updates, then it must be bare w/o updates!
export const IS_BARE_ENV_WITHOUT_UPDATES = !IS_MANAGED_ENV && !IS_BARE_ENV_WITH_UPDATES;
// Get the localAssets property from the ExpoUpdates native module so that we do
// not need to include expo-updates as a dependency of expo-asset
export function getLocalAssets() {
    return NativeModulesProxy.ExpoUpdates?.localAssets ?? {};
}
export function getManifest() {
    return Constants.__unsafeNoWarnManifest ?? {};
}
export function getManifest2() {
    return Constants.__unsafeNoWarnManifest2;
}
// Compute manifest base URL if available
export const manifestBaseUrl = Constants.experienceUrl
    ? getManifestBaseUrl(Constants.experienceUrl)
    : null;
// TODO: how should this behave in bare app with updates? re: hashAssetFiles
export async function downloadAsync(uri, hash, type, name) {
    if (IS_MANAGED_ENV) {
        return _downloadAsyncManagedEnv(uri, hash, type, name);
    }
    return _downloadAsyncUnmanagedEnv(uri, hash, type);
}
/**
 * Check if the file exists on disk already, perform integrity check if so.
 * Otherwise, download it.
 */
async function _downloadAsyncManagedEnv(uri, hash, type, name) {
    const cacheFileId = hash || computeMd5(uri);
    const localUri = `${FileSystem.cacheDirectory}ExponentAsset-${cacheFileId}.${type}`;
    let { exists, md5 } = await FileSystem.getInfoAsync(localUri, {
        md5: true,
    });
    if (!exists || (hash !== null && md5 !== hash)) {
        ({ md5 } = await FileSystem.downloadAsync(uri, localUri, {
            md5: true,
        }));
        if (hash !== null && md5 !== hash) {
            throw new Error(`Downloaded file for asset '${name}.${type}' ` +
                `Located at ${uri} ` +
                `failed MD5 integrity check`);
        }
    }
    return localUri;
}
/**
 * Just download the asset, don't perform integrity check because we don't have
 * the hash to compare it with (we don't have hashAssetFiles plugin). Hash is
 * only used for the file name.
 */
async function _downloadAsyncUnmanagedEnv(uri, hash, type) {
    // TODO: does this make sense to bail out if it's already at a file URL
    // because it's already available locally?
    if (uri.startsWith('file://')) {
        return uri;
    }
    const cacheFileId = hash || computeMd5(uri);
    const localUri = `${FileSystem.cacheDirectory}ExponentAsset-${cacheFileId}.${type}`;
    // We don't check the FileSystem for an existing version of the asset and we
    // also don't perform an integrity check!
    await FileSystem.downloadAsync(uri, localUri);
    return localUri;
}
//# sourceMappingURL=PlatformUtils.js.map