const FAKE_SDK = false;

// arkadium unity wrapper state
const arkSt = {
    api: undefined,
    loaded: false,
	logsEnabled: true,
    load(environment) {
        if (!this.loaded && !this.loading) {
            if ('ArkadiumGameSDK' in window) {
                this.loaded = true; // the arena may have loaded the SDK for us
                return Promise.resolve();
            }
            this.loading = this.loadInternal(environment);
            return this.loading;
        } else if (!this.loaded) {
            return this.loading;
        } else {
            return Promise.resolve();
        }
    },
    loadInternal(environment) {
        const gameObjectName = this.gameObjectName
        return new Promise((resolve) => {
            let isDev = environment === 'DEV';

            // check if environment should be fetched from url params
            if(environment === 'URL') {
                const urlParams = new URLSearchParams(window.location.search);
                isDev = urlParams.get('useSDKDevCDN') === 'true';
            }

            log('initializing', [isDev ? 'DEV' : 'PROD', gameObjectName]);
            
            const el = document.createElement('script');
            el.src = `https://developers.arkadium.com/cdn/sdk/${isDev ? 'dev/' : ''}v2/sdk.js`;
            document.head.appendChild(el);
            el.addEventListener('load', () => {
                this.loaded = true;
                resolve();
            });
        });
    }
};
window.arkSt = arkSt;

if (FAKE_SDK) {
    const log = (...args) => {
		console.log('%cFakeSDK', 'color: purple', ...args);
    }

    const api = {
        ads: {
            showInterstitialAd(...args) {
                log('api.ads.showInterstitialAd', args);
                return Promise.resolve();
            },
            showRewardAd(...args) {
                log('api.ads.showRewardAd', ...args);
                return Promise.resolve({ value: 1 });
            },
            showBannerAd(elementId, adSizes) {
                log('api.ads.showBannerAd', [elementId, adSizes]);
                const el = document.getElementById(elementId);
                if (el) {
                    el.style.background = 'red';
                    return Promise.resolve(true);
                }
                return Promise.resolve(false);
            }
        },
        analytics: {
            configureProvider(config) {
                log('api.analytics.configureProvider', [config]);
                return Promise.resolve();
            },
            sendEvent(eventCategory, eventAction, dimensionsObj) {
                log('api.analytics.sendEvent', [eventCategory, eventAction, dimensionsObj]);
                return Promise.resolve();
            },
            sendPageView(pageName, dimensionsObj) {
                log('api.analytics.sendPageView', [pageName, dimensionsObj]);
                return Promise.resolve();
            },
            setDimensions(dimensionsObj) {
                log('api.analytics.setDimensions', [dimensionsObj]);
                return Promise.resolve();
            }
        },
        auth: {
            isUserAuthorized(...args) {
                log('api.auth.isUserAuthorized', args);
                return Promise.resolve(true);
            },
            getUserProfile(...args) {
                log('api.auth.getUserProfile', args);
                return Promise.resolve({ profileParam: 'profileValue' });
            },
            onAuthStatusChange(...args) {
                log('api.auth.onAuthStatusChange', args);
                return Promise.resolve();
            },
            openAuthForm(...args) {
                log('api.auth.openAuthForm', args);
                return Promise.resolve();
            },
        },
        host: {
            openPurchaseForm(...args) {
                log('api.host.openPurchaseForm', args);
                return Promise.resolve();
            },
            getQueryParameter(key) {
                log('api.host.getQueryParameter', [key]);
                return Promise.resolve(`${key}-value`);
            },
            getDetails() {
                log('api.host.getDetails', []);
                return Promise.resolve({
                    GameKey: 'game-key',
                    GameVersion: 'game-version',
                    NestVersion: 'nest-version',
                    SdkVersion: 'sdk-version',
                });
            },
        },
        lifecycle: {
            onTestReady() {
                log('api.lifecycle.onTestReady', []);
            },
            onInteract() {
                log('api.lifecycle.onInteract', []);
            },
            onGameStart() {
                log('api.lifecycle.onGameStart', []);
            },
            onGameEnd() {
                log('api.lifecycle.onGameEnd', []);
            },
            onGameResume() {
                log('api.lifecycle.onGameResume', []);
            },
            onPauseReady() {
                log('api.lifecycle.onPauseReady', []);
            },
            onGamePause() {
                log('api.lifecycle.onGamePause', []);
            },
            onChangeScore(score) {
                log('api.lifecycle.onChangeScore', [score]);
            },
            onGemsUpdate(score) {
                log('api.lifecycle.onGemsUpdate', []);
            },
            onLevelStart(level) {
                log('api.lifecycle.onLevelStart', [level]);
            },
            onLevelEnd(level) {
                log('api.lifecycle.onLevelEnd', [level]);
            }
        },
        persistence: {
            setLocalStorageItem(...args) {
                log('api.persistence.setLocalStorageItem', args);
                return Promise.resolve();
            },
            getLocalStorageItem(...args) {
                log('api.persistence.getLocalStorageItem', args);
                return Promise.resolve('bogus');
            },
            removeLocalStorageItem(...args) {
                log('api.persistence.removeLocalStorageItem', args);
                return Promise.resolve();
            },
            getCookie(...args) {
                log('api.persistence.getCookie', args);
                return Promise.resolve('bogus');
            }
        },
    }

    arkSt.loadInternal = () => {
        return new Promise((resolve) => {
            log('fake load script');

            setTimeout(() => {
                window.ArkadiumGameSDK = {
                    getInstance(env) {
                        return Promise.resolve(api);
                    }
                }
                this.loaded = true;
                resolve();
                log('fake load done');
            }, 200);
        });
    };
}
