/* eslint-disable no-new */
// if ((module as any).hot) {
//     (module as any).hot.accept();
// }

import * as dotenv from 'dotenv'; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import
import * as React from 'react';
import * as ReactDOM from 'react-dom/client';
import { AssignAllExtensions } from '../../extensions/Extensions';
import { Doc } from '../../fields/Doc';
import { FieldLoader } from '../../fields/FieldLoader';
import { BranchingTrailManager } from '../util/BranchingTrailManager';
import { CurrentUserUtils } from '../util/CurrentUserUtils';
import { LinkFollower } from '../util/LinkFollower';
import { PingManager } from '../util/PingManager';
import { ReplayMovements } from '../util/ReplayMovements';
import { TrackMovements } from '../util/TrackMovements';
import { KeyManager } from './GlobalKeyHandler';
import { MainView } from './MainView';
import { CollectionView } from './collections/CollectionView';
import { CollectionFreeFormInfoUI } from './collections/collectionFreeForm/CollectionFreeFormInfoUI';
import './global/globalScripts';
import { KeyValueBox } from './nodes/KeyValueBox';

dotenv.config();

AssignAllExtensions();
FieldLoader.ServerLoadStatus = { requested: 0, retrieved: 0, message: 'cache' }; // bcz: not sure why this is needed to get the code loaded properly...

(async () => {
    MainView.Live = window.location.search.includes('live');
    const rootEle = document.getElementById('root');
    if (!rootEle) return;
    rootEle.style.zIndex = '0';
    const root = ReactDOM.createRoot(rootEle);
    root.render(<FieldLoader />);
    window.location.search.includes('safe') && CollectionView.SetSafeMode(true);
    const info = await CurrentUserUtils.loadCurrentUser();
    // if (info.email === 'guest') DocServer.Control.makeReadOnly();
    if (!info.userDocumentId) {
        alert('Fatal Error: user not found in database');
        return;
    }
    await CurrentUserUtils.loadUserDocument(info);
    setTimeout(() => {
        document.getElementById('root')!.addEventListener(
            'wheel',
            event => {
                if (event.ctrlKey) {
                    event.preventDefault();
                }
            },
            true
        );
        const startload = (document as any).startLoad;
        const loading = Date.now() - (startload ? Number(startload) : Date.now() - 3000);
        console.log('Loading Time = ' + loading);
        const d = new Date();
        d.setTime(d.getTime() + 100 * 24 * 60 * 60 * 1000);
        const expires = 'expires=' + d.toUTCString();
        document.cookie = `loadtime=${loading};${expires};path=/`;
        new TrackMovements();
        new ReplayMovements();
        new BranchingTrailManager({});
        new PingManager();
        new KeyManager();

        // iniitialize plugin apis
        CollectionFreeFormInfoUI.Init();
        LinkFollower.Init();
        KeyValueBox.Init();
        root.render(<MainView />);
    }, 0);
})();
