import { Sequelize, QueryInterface, QueryTypes, Op } from 'sequelize';
import * as Constants from "../src/api/config/constants"
import _ from 'lodash';
interface universalIdentifier {
    id: number
}
const date = new Date()

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[];
        const roles = [
            {
                code: 'superadmin',
                is_default: false,
                status: Constants.ROLE.STATUS.ACTIVE,
                created_at: date,
                updated_at: date,
                roleContent: {
                    name: "Super Admin",
                    description: "Super Admin",
                    description_text: "Super Admin",
                    language_id: languages[0].id
                }
            },
            {
                code: 'admin',
                is_default: false,
                status: Constants.ROLE.STATUS.ACTIVE,
                created_at: date,
                updated_at: date,
                roleContent: {
                    name: "Administrator",
                    description: "Administrator",
                    description_text: "Administrator",
                    language_id: languages[0].id
                }
            },
            {
                code: 'author',
                is_default: false,
                status: Constants.ROLE.STATUS.ACTIVE,
                created_at: date,
                updated_at: date,
                roleContent: {
                    name: "Author",
                    description: "Author",
                    description_text: "Author",
                    language_id: languages[0].id
                }
            },
            {
                code: 'user',
                is_default: true,
                status: Constants.ROLE.STATUS.ACTIVE,
                created_at: date,
                updated_at: date,
                roleContent: {
                    name: "User",
                    description: "User",
                    description_text: "User",
                    language_id: languages[0].id
                }
            }
        ];
        let defaultUser = await queryInterface.sequelize.query(`select id from users order by id ASC limit 1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
        if (defaultUser.length == 0) {
            let offset = 0;
            for (let role of roles) {
                let roleDetails = _.pick(role, ['code', 'is_default', 'status', 'created_at', 'updated_at']);
                await queryInterface.bulkInsert('roles', [roleDetails]);
                let newRoleDetails = await queryInterface.sequelize.query(`select id from roles order by id ASC limit ${offset},1`, { type: QueryTypes.SELECT }) as universalIdentifier[];
                let content = { ...role.roleContent, ...{ role_id: newRoleDetails[0].id, created_at: date, updated_at: date } }
                try {
                    await queryInterface.bulkInsert('role_content', [content]);
                } catch (err) {
                    console.log(err);
                }
                offset++;
            }
        } else {
            console.log("system already initialized")
        }
    },
    down: async (queryInterface: QueryInterface) => {
        await queryInterface.bulkDelete('users', { id: { [Op.gt]: 0 } });
    },
};
