
// Pages
// Core
// TCG
import PageMtgDecks from './pages/tcg/mtg_decks.js';
import PageMtgGame from './pages/tcg/mtg_game.js';
import PageMtgGames from './pages/tcg/mtg_games.js';
import PageMtgHome from './pages/tcg/mtg_home.js';
// Legal
import PageAccessibilityReport from './pages/legal/accessibility_report.js';
import PageAccessibilityStatement from './pages/legal/accessibility_statement.js';
import PageLicense from './pages/legal/license.js';
import PagePrivacyPolicy from './pages/legal/privacy_policy.js';
import PageRetentionSchedule from './pages/legal/retention_schedule.js';
// User
// import PageUserLogin from './pages/user/login.js';
// import PageUserLogout from './pages/user/logout.js';
import PageUser from './pages/user/user.js';
import PageUsers from './pages/user/users.js';

import API from './api.js';
import DOM from './dom.js';
import Utils from './lib/utils.js';


export default class Router {
    constructor() {
        // Pages
        this.pages = {};
        // Core
        // TCG
        this.pages[hashPageMtgDecks] = { name: 'PageMtgDecks', module: PageMtgDecks };
        this.pages[hashPageMtgGame] = { name: 'PageMtgGame', module: PageMtgGame };
        this.pages[hashPageMtgGames] = { name: 'PageMtgGames', module: PageMtgGames };
        this.pages[hashPageMtgHome] = { name: 'PageMtgGame', module: PageMtgHome };
        // Legal
        this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };
        this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };
        this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense };
        this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy };
        // User
        // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' };
        // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' };
        this.pages[hashPageUserAccount] = { name: 'PageUser', module: PageUser };
        this.pages[hashPageUserAccounts] = { name: 'PageUsers', module: PageUsers };
        // Routes
        this.routes = {};
        // Core
        // TCG
        this.routes[hashPageMtgDecks] = (isPopState = false) => this.navigateToHash(hashPageMtgDecks, isPopState);
        this.routes[hashPageMtgGame] = (isPopState = false) => this.navigateToHash(hashPageMtgGame, isPopState);
        this.routes[hashPageMtgGames] = (isPopState = false) => this.navigateToHash(hashPageMtgGames, isPopState);
        this.routes[hashPageMtgHome] = (isPopState = false) => this.navigateToHash(hashPageMtgHome, isPopState);
        // Legal
        this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);
        this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);
        this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState);
        this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState);
        // User
        // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState);
        // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState);
        this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState);
        this.routes[hashPageUserAccounts] = (isPopState = false) => this.navigateToHash(hashPageUserAccounts, isPopState);
        this.initialize();
    }
    loadPage(hashPage, isPopState = false) {
        const PageClass = this.getClassPageFromHash(hashPage);
        this.currentPage = new PageClass(this);
        this.currentPage.initialize(isPopState);
        window.addEventListener('beforeunload', () => this.currentPage.leave());
    }
    getClassPageFromHash(hashPage) {
        
        let pageJson = this.pages[hashPage];
        try {
            const module = pageJson.module;
            return module; 
        }
        catch (error) {
            Utils.consoleLogIfNotProductionEnvironment("this.pages: ", this.pages);
            console.error('Page not found:', hashPage);
            throw error;
        }
    }
    initialize() {
        window.addEventListener('popstate', this.handlePopState.bind(this));
    }
    handlePopState(event) {
        this.loadPageCurrent();
    }
    loadPageCurrent() {
        const hashPageCurrent = DOM.getHashPageCurrent();
        this.loadPage(hashPageCurrent);
    }
    navigateToHash(hash, data = null, params = null, isPopState = false) {
        let url = API.getUrlFromHash(hash, params);
        history.pushState({data: data, params: params}, '', hash);
        API.goToUrl(url, data);
    }
    
    navigateToUrl(url, data = null, appendHistory = true) {
        // this.beforeLeave();
        if (appendHistory) history.pushState(data, '', url);
        url = API.parameteriseUrl(url, data);
        API.goToUrl(url);
    }

    static loadPageBodyFromResponse(response) {
        DOM.loadPageBody(response.data);
    }
}

export const router = new Router();
