/* tslint:disable:no-console */
import path from 'path';
import { DataSourceOptions } from 'typeorm';
import { WinstonLogger, LogLevel, TypeOrmLogger, SystemConfig, DefaultJobQueuePlugin } from '@phoenix/core';
import { AssetServerPlugin } from '@phoenix/asset-server-plugin';
import { ADMIN_API_PATH, API_PORT, SHOP_API_PATH, SUPER_ADMIN_USER_IDENTIFIER } from '@phoenix/common';
import { EmailPlugin, FileBasedTemplateLoader, defaultEmailHandlers } from '@phoenix/email-plugin';
import { BillBeePlugin } from "@phoenix/bill-bee-plugin";
import { ChannelPilotProPlugin } from "@phoenix/channel-pilot-pro-plugin";
import { ShopifyPlugin } from '@phoenix/shopify-plugin';

// RedisSessionCachePlugin

/**
 * Config settings used during development
 */
export const customConfig: SystemConfig = {
    apiOptions: {
        port: API_PORT,
        // sslPort: API_SSL_PORT,
        //sslCertPath: path.join(__dirname, '../secrets/certificate.crt'),
        //sslKeyPath: path.join(__dirname, '../secrets/certificate.key'),
        adminApiPath: ADMIN_API_PATH,
        shopApiPath: SHOP_API_PATH,
        cors: {
            origin: true,
            credentials: true,
        },
    },
    authOptions: {
        disableAuth: true,
        sessionSecret: 'some-secret',
        requireVerification: false,
        tokenMethod: "bearer",
        superadminCredentials: {
            identifier: SUPER_ADMIN_USER_IDENTIFIER,
            password: process.env.SUPER_ADMIN_USER_PASSWORD || 'superadmin'
        }
    },
    dbConnectionOptions: {
        // synchronize: true,
        // logging: true,
        logger: new TypeOrmLogger(),
        ...getDbConfig(),
        // logging: ["error"]
    },
    // paymentOptions: {
    //     // paymentMethodHandlers: [examplePaymentHandler],
    // },
    customFields: {
        Product: [
            {
                name: 'testo',
                type: 'string',
            }
        ],
        DocumentLineItem: [
        ],
        PostProductionDetail: [
        ],
    },
    searchableFields: {
        processResource: [
            "scanId"
        ]
    },
    logger: new WinstonLogger({ level: LogLevel.Debug }),
    workerLogger: new WinstonLogger({ level: LogLevel.Info }),
    //importExportOptions: {
    //    importProductAssetsDir: path.join(__dirname, 'import', 'product-assets'),
    //},
    defaults: {
        defaultTakeNumber: 100,
    },
    plugins: [
        // RedisSessionCachePlugin.init({
        //     namespace: 'phx-session',
        //     redisOptions: {
        //         host: process.env.REDIS_HOST || 'redis',
        //         port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : 6379,
        //         db: process.env.REDIS_DB ? parseInt(process.env.REDIS_DB) : 0,
        //         password: process.env.REDIS_PASSWORD || 'admin'
        //     }
        // }),
        AssetServerPlugin.init({
            route: 'remote-assets',
            assetUploadDir: path.join(__dirname, 'assets'),
            port: 5002,
            assetUrlPrefix: "\\remote-assets\\" //  to make it relative for client
        }),
        DefaultJobQueuePlugin.init({
            useDatabaseForBuffer: true
        }),
        EmailPlugin.init({
            sendRealEmails: true,
            route: 'mailbox',
            handlers: [...defaultEmailHandlers],
            // Dynamic Email Templates
            templateLoader: new FileBasedTemplateLoader(path.join(__dirname, '..', '../email-plugin/templates')),
            globalTemplateVars: {
                verifyEmailAddressUrl: 'http://localhost:4201/verify',
                passwordResetUrl: 'http://localhost:4201/reset-password',
                changeEmailAddressUrl: 'http://localhost:4201/change-email-address',
            }
        }),
        BillBeePlugin.init({
            active: process.env.BILL_BEE_ACTIVE === 'true',
        }),
        ChannelPilotProPlugin.init({
            active: process.env.CHANNEL_PILOT_PRO_ACTIVE === 'true'
        }),
        ShopifyPlugin.init({
            active: process.env.SHOPIFY_ACTIVE === 'true'
        }),
        // DefaultStoragePlaceRankPlugin.init({})
        // new DefaultSearchPlugin(),
        // new ElasticsearchPlugin({
        //     host: 'http://192.168.99.100',
        //     port: 9200,
        // }),
        // DocusignPlugin.init({
        //     devMode:true,
        //     handlers: defaultDocusignHandlers,
        //     assetDownloadDir:  path.join(__dirname, 'docusign'),
        //     assetUploadDir:  path.join(__dirname, 'docusign'),
        //     port: API_PORT,
        //     route: "docusign"
        // }),
        // new AdminUiPlugin({
        //     port: 5001,
        // }),
    ]
    // ApolloEngineApiKey: "service:Logic-Bits-2900:5w1aCP5YUtF-1ErRG0KNQw"
};

function getDbConfig(): DataSourceOptions {
    const dbType = process.env.DB || 'postgres';
    const dbHost = process.env.DB_HOST || 'localhost';
    const dbPort = +process.env.DB_PORT || 5432;

    const connectionPoolMax = process.env.CONNECTION_POOL_MAX ?? 20;

    const dbUsername = process.env.DB_USERNAME || 'postgres';
    const password = process.env.DB_PASSWORD || 'admin';
    const database = process.env.DB_NAME || 'phoenix'

    if (password == "admin")
        console.warn("default postgres password is used!");

    if (process.env.DB_HOST)
        console.log(`using DB Host ${dbHost} from env`);

    console.log(`using Database ${database}`);
    console.log(`using User ${dbUsername}`);

    switch (dbType) {
        case 'postgres':
            console.log('Using postgres connection at ' + dbHost);
            return {
                synchronize: false,
                type: 'postgres',
                //host: '127.0.0.1',
                host: dbHost,
                port: dbPort,
                username: dbUsername,
                password: password,
                database: database,
                // logging: "all",
                extra: {
                    max: connectionPoolMax
                }
            };
        case 'sqlite':
            console.log('Using sqlite connection');
            return {
                type: 'sqlite',
                database: path.join(__dirname, 'phoenix.sqlite'),
            };
        case 'sqljs':
            console.log('Using sql.js connection');
            return {
                type: 'sqljs',
                autoSave: true,
                database: new Uint8Array([]),
                location: path.join(__dirname, 'phoenix.sqlite'),
            };
        case 'mysql':
        default:
            console.log('Using mysql connection');
            return {
                synchronize: true,
                type: 'mysql',
                host: '192.168.99.100',
                port: 3306,
                username: 'root',
                password: '',
                database: 'phoenix-dev',
            };
    }
}
