
class SpinningPage extends Page {
    static htmlTemplate()
    {
        return `<div style="position: absolute; width: 100%; padding-top: 25%; text-align: center;"><spinner-icon></spinner-icon></div>`;
    }
}

function main() {
    const requiredFeatures = {
        'Shadow DOM API': () => { return !!Element.prototype.attachShadow; },
    };

    for (const name in requiredFeatures) {
        if (!requiredFeatures[name]())
            return alert(`Your browser does not support ${name}. Try using the latest Safari or Chrome.`);
    }

    (new SpinningPage).open();

    Manifest.fetch().then(function (manifest) {
        const dashboardToolbar = new DashboardToolbar;
        const dashboardPages = [];
        if (manifest.dashboards) {
            for (const name in manifest.dashboards)
                dashboardPages.push(new DashboardPage(name, manifest.dashboards[name], dashboardToolbar));
        }

        const summaryPages = [];
        let testFreshnessPage = null;
        if (manifest.summaryPages) {
            for (const summaryPage of manifest.summaryPages)
                summaryPages.push(new SummaryPage(summaryPage));
            testFreshnessPage = new TestFreshnessPage(manifest.summaryPages, manifest.testAgeToleranceInHours);
        }

        const chartsToolbar = new ChartsToolbar;
        const chartsPage = new ChartsPage(chartsToolbar);
        const analysisCategoryPage = new AnalysisCategoryPage();

        summaryPages.push(chartsPage);
        summaryPages.push(analysisCategoryPage);
        if (testFreshnessPage)
            summaryPages.push(testFreshnessPage);

        const createAnalysisTaskPage = new CreateAnalysisTaskPage();
        createAnalysisTaskPage.setParentPage(analysisCategoryPage);

        const analysisTaskPage = new AnalysisTaskPage();
        analysisTaskPage.setParentPage(analysisCategoryPage);

        const buildRequestQueuePage = new BuildRequestQueuePage();
        buildRequestQueuePage.setParentPage(analysisCategoryPage);

        const heading = new Heading(manifest.siteTitle);
        heading.addPageGroup(summaryPages);

        heading.setTitle(manifest.siteTitle);
        heading.addPageGroup(dashboardPages);

        const router = new PageRouter();
        for (const summaryPage of summaryPages)
            router.addPage(summaryPage);
        router.addPage(createAnalysisTaskPage);
        router.addPage(analysisTaskPage);
        router.addPage(buildRequestQueuePage);
        for (const page of dashboardPages)
            router.addPage(page);

        if (summaryPages.length)
            router.setDefaultPage(summaryPages[0]);
        else if (dashboardPages.length)
            router.setDefaultPage(dashboardPages[0]);
        else
            router.setDefaultPage(chartsPage);

        heading.setRouter(router);
        router.route();
    }).catch(function (error) {
        alert('Failed to load the site manifest: ' + error);
    });
}

if (document.readyState != 'loading')
    main();
else
    document.addEventListener('DOMContentLoaded', main);
