/**
 * Entry Point
 * Belongs to LocalCDN (since 2020-02-26)
 * (Origin: Decentraleyes)
 *
 * @author      Thomas Rientjes
 * @since       2016-04-04
 *
 * @author      nobody
 * @since       2020-02-26
 *
 * @license     MPL-2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/.
 */

'use strict';


/**
 * Main
 */

var main = {};


/**
 * Private Methods
 */

main._initializeSettings = function () {
    storageManager.checkStorageType();

    storageManager.type.get(null, function (items) {
        // Delete old keys
        if (items.whitelistedDomains !== undefined) {
            if (items.allowlistedDomains === undefined || Object.keys(items.allowlistedDomains).length === 0) {
                items['allowlistedDomains'] = items.whitelistedDomains;
            }
            delete items['whitelistedDomains'];
            storageManager.type.remove('whitelistedDomains');
        }

        // Convert value of notifications
        if (items.hideReleaseNotes !== undefined) {
            if (items.hideReleaseNotes === true) {
                items.updateNotification = 0;
            } else {
                items.updateNotification = 2;
            }
            delete items['hideReleaseNotes'];
            storageManager.type.remove('hideReleaseNotes');
        }

        // Use default if key is missing
        for (const key of Object.keys(SettingDefaults)) {
            if (items[key] === undefined) {
                items[key] = SettingDefaults[key];
            }
        }

        if (items.disablePrefetch !== false) {
            chrome.privacy.network.networkPredictionEnabled.set({
                'value': false
            });
        }

        stateManager.selectedIcon = items.selectedIcon;
        wrappers.setIcon({
            'path': stateManager.selectedIcon
        }, 'Enabled');

        storageManager.amountInjected = items.amountInjected || 0;
        interceptor.xhrTestDomain = items.xhrTestDomain || Address.LOCALCDN;
        interceptor.allowedDomainsGoogleFonts = items.allowedDomainsGoogleFonts || {};
        interceptor.blockMissing = items.blockMissing === undefined ? false : items.blockMissing;
        interceptor.blockGoogleFonts = items.blockGoogleFonts === undefined ? true : items.blockGoogleFonts;
        requestAnalyzer.allowlistedDomains = items.allowlistedDomains || {};

        storageManager.type.set(items);
    });
};

main._showReleaseNotes = function (details) {
    storageManager.checkStorageType();

    if (details.reason === chrome.runtime.OnInstalledReason.INSTALL) {
        storageManager.type.set({
            [Setting.LAST_MAPPING_UPDATE]: mappings.lastMappingUpdate
        }, function () {
            if (details.temporary !== true) {
                chrome.tabs.create({
                    'url': chrome.runtime.getURL('pages/welcome/welcome.html'),
                    'active': true
                });
            }
        });
    } else if (details.reason === chrome.runtime.OnInstalledReason.UPDATE) {
        storageManager.type.get(null, function (items) {
            let mappingUpdate = items.lastMappingUpdate !== mappings.lastMappingUpdate;

            // Remove old keys
            for (const key of Object.keys(items)) {
                if (!(key in SettingDefaults)) {
                    delete items[key];
                }
            }
            // Override old value https://codeberg.org/nobody/LocalCDN/issues/177
            items.xhrTestDomain = 'localcdn.org';

            // Updated mappings.js
            if (mappingUpdate) {
                items.lastMappingUpdate = mappings.lastMappingUpdate;
                storageManager.type.set(items);
            }

            if ((mappingUpdate && items.updateNotification === 1) || items.updateNotification === 2) {
                chrome.tabs.create({
                    'url': chrome.runtime.getURL(`pages/updates/updates.html?mappingupdate=${mappingUpdate}`),
                    'active': false
                });
            } else {
                // No mappings.js update

            }
        });
    }
};


/**
 * Initializations
 */
chrome.runtime.onInstalled.addListener(main._showReleaseNotes);
main._initializeSettings();