// Load zone.js for the server.
import 'reflect-metadata';
import 'zone.js/dist/zone-node';

import {APP_BASE_HREF} from '@angular/common';
import {enableProdMode} from '@angular/core';
import {renderModuleFactory} from '@angular/platform-server';
import {provideModuleMap} from '@nguniversal/module-map-ngfactory-loader';
import {existsSync, mkdirSync, readFileSync, writeFileSync} from 'fs';
import {join} from 'path';
import {PRERENDERED_ROUTES} from './static.paths';

enableProdMode();

const {AppServerModuleNgFactory, LAZY_MODULE_MAP} = require('../server/main');
const DEMO_FOLDER = join(process.cwd(), 'dist', 'demo', 'browser');
const index = readFileSync(
    join(process.cwd(), 'dist', 'demo', 'browser', 'index.html'),
    'utf8',
);
const localFallback = 'http://localhost:4200/';

let previousRender = Promise.resolve();

// Iterate each route path
PRERENDERED_ROUTES.forEach(route => {
    const fullPath = join(DEMO_FOLDER, route);

    // Make sure the directory structure is there
    if (!existsSync(fullPath)) {
        mkdirSync(fullPath);
    }

    // Writes rendered HTML to index.html, replacing the file if it already exists.
    previousRender = previousRender
        .then(() =>
            renderModuleFactory(AppServerModuleNgFactory, {
                document: index,
                url: route,
                extraProviders: [
                    provideModuleMap(LAZY_MODULE_MAP),
                    {
                        provide: APP_BASE_HREF,
                        useValue: process.env.ORIGIN || localFallback,
                    },
                ],
            }),
        )
        .then(html => writeFileSync(join(fullPath, 'index.html'), html));
});