import translations from './server/translations';
import config from './server/config';
import fs from 'fs';
import {buildDict} from "./src/helpers";

const locale = config.locale;
const title = translations.title;
const description = translations.description;
const banner = process.env.BASE_URL + '/banner/zaimki.png';
const colour = '#C71585';

const bodyParser = require('body-parser');

export default {
    target: 'server',
    head: {
        title: title,
        meta: [
            { charset: 'utf-8' },

            { hid: 'description', name: 'description', content: description },

            { name: 'viewport', content: 'width=device-width, initial-scale=1' },
            { hid: 'apple-mobile-web-app-title', name: 'apple-mobile-web-app-title', content: title },
            { hid: 'theme-color', name: 'theme-color', content: colour },

            { hid: 'og:type', property: 'og:type', content: 'article' },
            { hid: 'og:title', property: 'og:title', content: title },
            { hid: 'og:description', property: 'og:description', content: description },
            { hid: 'og:site_name', property: 'og:site_name', content: title },
            { hid: 'og:logo', property: 'og:logo', content: banner },

            { hid: 'twitter:card', property: 'twitter:card', content: 'summary_large_image' },
            { hid: 'twitter:title', property: 'twitter:title', content: title },
            { hid: 'twitter:description', property: 'twitter:description', content: description },
            { hid: 'twitter:site', property: 'twitter:site', content: process.env.BASE_URL },
            { hid: 'twitter:image', property: 'twitter:image', content: banner },
        ],
        link: [
            { rel: 'icon', type: 'image/svg', href: '/favicon.svg' }
        ],
    },
    css: [],
    plugins: [
        { src: '~/plugins/vue-matomo.js', ssr: false },
        { src: '~/plugins/globals.js' },
        { src: '~/plugins/auth.js' },
    ],
    components: true,
    buildModules: [],
    modules: [
        '@nuxtjs/pwa',
        '@nuxtjs/axios',
        ['@nuxtjs/redirect-module', {
            rules: config.redirects,
        }],
        'cookie-universal-nuxt',
    ],
    pwa: {
        manifest: {
            name: title,
            short_name: title,
            description: description,
            background_color: '#ffffff',
            theme_color: colour,
            lang: locale,
        }
    },
    build: {
        extend (config, ctx) {
            config.module.rules.push({
                test: /\.csv|\.tsv$/,
                loader: 'csv-loader',
                options: {
                    dynamicTyping: true,
                    header: true,
                    skipEmptyLines: true,
                    delimiter: '\t',
                }
            });
            config.module.rules.push({
                test: /\.suml$/,
                    loader: 'suml-loader',
            });
        },
    },
    env: {
        BASE_URL: process.env.BASE_URL,
        PUBLIC_KEY: fs.readFileSync(__dirname + '/keys/public.pem').toString(),
        LOCALE: config.locale,
        FLAGS: buildDict(function *() {
            for (let flag of fs.readdirSync(__dirname + '/static/flags/')) {
                if (flag.startsWith('.')) {
                    continue;
                }
                yield [
                    flag.replace(new RegExp('\.png$'), ''),
                    flag.replace(new RegExp('\.png$'), '')
                        .replace(new RegExp('_', 'g'), '')
                        .trim()
                ];
            }
        }),
    },
    serverMiddleware: {
        '/': bodyParser.json(),
        '/banner': '~/server/banner.js',
        '/api/nouns': '~/server/nouns.js',
        '/api/user': '~/server/user.js',
        '/api/profile': '~/server/profile.js',
        '/api/admin': '~/server/admin.js',
        '/api/sources': '~/server/sources.js',
    },
    axios: {
        baseURL: process.env.BASE_URL + '/api',
    },
    router: {
        extendRoutes(routes, resolve) {
            if (config.sources.enabled) {
                routes.push({ path: '/' + config.sources.route, component: resolve(__dirname, 'routes/sources.vue') });
            }

            if (config.nouns.enabled) {
                routes.push({ path: '/' + config.nouns.route, component: resolve(__dirname, 'routes/nouns.vue') });
            }

            if (config.names.enabled) {
                routes.push({ path: '/' + config.names.route, component: resolve(__dirname, 'routes/names.vue') });
            }

            if (config.faq.enabled) {
                routes.push({ path: '/' + config.faq.route, component: resolve(__dirname, 'routes/faq.vue') });
            }

            if (config.links.enabled) {
                routes.push({ path: '/' + config.links.route, component: resolve(__dirname, 'routes/links.vue') });
            }

            if (config.people.enabled) {
                routes.push({ path: '/' + config.people.route, component: resolve(__dirname, 'routes/people.vue') });
            }

            if (config.english.enabled) {
                routes.push({ path: '/' + config.english.route, component: resolve(__dirname, 'routes/english.vue') });
            }

            if (config.contact.enabled) {
                routes.push({ path: '/' + config.contact.route, component: resolve(__dirname, 'routes/contact.vue') });
            }

            if (config.user.enabled) {
                routes.push({path: '/' + config.user.route, component: resolve(__dirname, 'routes/user.vue')});
                routes.push({path: '/' + config.user.termsRoute, component: resolve(__dirname, 'routes/terms.vue')});
            }
            routes.push({ path: '/admin', component: resolve(__dirname, 'routes/admin.vue') });

            if (config.profile.enabled) {
                routes.push({path: '/@*', component: resolve(__dirname, 'routes/profile.vue')});
                if (config.profile.editorEnabled) {
                    routes.push({path: '/' + config.profile.editorRoute, component: resolve(__dirname, 'routes/profileEditor.vue')});
                }
            }

            if (config.template.enabled) {
                routes.push({ path: '/' + config.template.any.route, component: resolve(__dirname, 'routes/any.vue') });
            }

            routes.push({ name: 'all', path: '*', component: resolve(__dirname, 'routes/template.vue') });
        },
    },
}
