import { Sequelize, QueryInterface, QueryTypes } from 'sequelize';
import * as Constants from "../src/api/config/constants"
import { permission } from 'process';
import _ from 'lodash';
const date = new Date()
interface universalIdentifier {
    id: number
}
export default {
    up: async (queryInterface: QueryInterface) => {
        let languages = await queryInterface.sequelize.query(`select id from languages where code in ('${process.env.DEFAULT_LANGUAGE_CODE}','en') limit 1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
        let user = await queryInterface.sequelize.query(`select id from users order by id ASC limit 0,1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
        let categoryType = await queryInterface.sequelize.query(`select id from category_types where code = 'setting' limit 0,1`, { type: QueryTypes.SELECT }) as universalIdentifier[];

        if (languages.length && user.length && categoryType.length) {
            const categoryContentData = [
                {
                    category_type_id: categoryType[0].id,
                    code: 'general-setting',
                    user_id: null,
                    accountId: null,
                    status: Constants.CONTENT_TYPE.STATUS.ACTIVE,
                    created_at: date,
                    updated_at: date,
                    sort_order: 1,
                    level: 1,
                    categoryContent: {
                        name: "General Setting",
                        language_id: languages[0].id,
                        description: "Category to manage general settings",
                        description_text: "Category to manage general settings"
                    }
                }
            ];

            // let offset = 0;
            let setting = await queryInterface.sequelize.query(`select id from settings order by id ASC limit 0,1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
            let parentId = null;
            if (setting.length == 0) {
                for (let contentType of categoryContentData) {
                    let contentTypeDetails = _.pick(contentType, ['code', 'user_id', 'status', 'sort_order', 'created_at', 'updated_at', 'category_type_id','level']);
                    let data = await queryInterface.bulkInsert('categories', [contentTypeDetails]);
                    // let categoryDetails = await queryInterface.sequelize.query(`select id from categories order by id ASC limit ${offset},1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
                    let content = { ...contentType.categoryContent, ...{ category_id: data, created_at: date, updated_at: date } };
                    parentId = data;
                    try {
                        await queryInterface.bulkInsert('category_content', [content]);
                    } catch (err) {
                        console.log(err);
                    }
                    // offset++;
                }



                const categorySettingsData = [
                    {
                        category_type_id: categoryType[0].id,
                        code: 'trial-period',
                        user_id: null,
                        accountId: null,
                        status: Constants.CONTENT_TYPE.STATUS.ACTIVE,
                        created_at: date,
                        updated_at: date,
                        sort_order: 2,
                        level: 2,
                        parent_id: parentId,
                        categoryContent: {
                            name: "Trial Period",
                            language_id: languages[0].id,
                            description: "Category to manage trial period settings",
                            description_text: "Category to manage trial period settings"
                        },
                        setting: {
                            user_id: null,
                            accountId: null,
                            status: Constants.CONTENT_TYPE.STATUS.ACTIVE,
                            code: "trial-period",
                            sort_order: 1,
                            value_type: "number",
                            label: "Trial Period",
                            language_id: languages[0].id,
                            value_string: null,
                            value_text: null,
                            value_boolean: null,
                            value_numeric: 10
                        }
                    },
                    {
                        category_type_id: categoryType[0].id,
                        code: 'referral-bonus',
                        user_id: null,
                        accountId: null,
                        status: Constants.CONTENT_TYPE.STATUS.ACTIVE,
                        created_at: date,
                        updated_at: date,
                        sort_order: 3,
                        level: 2,
                        parent_id: parentId,
                        categoryContent: {
                            name: "Referral Bonus",
                            language_id: languages[0].id,
                            description: "Category to manage referral bonus settings",
                            description_text: "Category to manage referral bonus settings"
                        },
                        setting: {
                            user_id: null,
                            accountId: null,
                            status: Constants.CONTENT_TYPE.STATUS.ACTIVE,
                            code: "referral-bonus",
                            sort_order: 2,
                            value_type: "number",
                            label: "Referral Bonus",
                            language_id: languages[0].id,
                            value_string: null,
                            value_text: null,
                            value_boolean: null,
                            value_numeric: 500
                        }
                    }
                ];

                for (let contentType of categorySettingsData) {
                    let contentTypeDetails = _.pick(contentType, ['code', 'user_id', 'status', 'sort_order', 'created_at', 'updated_at', 'category_type_id','level','parent_id']);
                    let categoryId = await queryInterface.bulkInsert('categories', [contentTypeDetails]);
                    
                    let content = { ...contentType.categoryContent, ...{ category_id: categoryId, created_at: date, updated_at: date } };
                    let settings = _.pick(contentType.setting, ['code', 'user_id', 'status', 'sort_order', 'created_at', 'updated_at', 'value_type']);
                    settings = { ...settings, ...{category_id: categoryId, created_at: date, updated_at: date} }
                    let settingsContent =  _.pick(contentType.setting, ['label','language_id','value_string','value_text','value_boolean','value_numeric']);
                    try {

                        await queryInterface.bulkInsert('category_content', [content]);
                        let data = await queryInterface.bulkInsert('settings', [settings]);
                        if(data) {
                            settingsContent = {...settingsContent, ...{setting_id: data, created_at: date, updated_at: date}};
                            await queryInterface.bulkInsert('setting_content', [settingsContent]);
                        }
                    } catch (err) {
                        console.log(err);
                    }
                }
            } else {
                console.log("setting already initialized")
            }



        } else {
            console.log("unable to created category")
        }
    },
    down: async (queryInterface: QueryInterface) => {
        await queryInterface.bulkDelete('categories', { code: [process.env.DEFAULT_LANGUAGE_CODE!, 'en'] }, {})
    },
};
