/*
 * Copyright (c) 2022.
 * Author Peter Placzek (tada5hi)
 * For the full copyright and license information,
 * view the LICENSE file that was distributed with this source code.
 */

import {Factory, Seeder} from "typeorm-seeding";
import {Connection, getRepository} from "typeorm";
import {UserRepository} from "@chamesu/common/domains/auth/user/repository";
import {RoleRepository} from "@chamesu/common/domains/auth/role/repository";
import {AuthPermission} from "@chamesu/common/domains/auth/permission";
import {AuthRolePermission} from "@chamesu/common/domains/auth/role/permission";
import {AuthUserRole} from "@chamesu/common/domains/auth/user/role";

export default class CreateAuth implements Seeder {
    public async run(factory: Factory, connection: Connection) : Promise<any> {
        //-------------------------------------------------

        const roleRepository = connection.getCustomRepository(RoleRepository);

        let adminRole = roleRepository.create({
            name: 'admin'
        });

        await roleRepository.save(adminRole);

        //-------------------------------------------------

        const userRepository = connection.getCustomRepository(UserRepository);

        let adminUser = userRepository.create({
            name: 'admin',
            password: await userRepository.hashPassword('start123'),
            email: 'peter.placzek1996@gmail.com'
        });

        await userRepository.save(adminUser);

        //-------------------------------------------------

        const userRoleRepository = getRepository(AuthUserRole);

        await userRoleRepository.insert({
            role_id: adminRole.id,
            user_id: adminUser.id
        });

        //-------------------------------------------------

        const permissionRepository = connection.getRepository(AuthPermission);
        const names : string[] = [
            'admin_ui_use',

            'realm_add',
            'realm_drop',
            'realm_edit',

            'provider_add',
            'provider_drop',
            'provider_edit',

            'permission_add',
            'permission_drop',
            'permission_edit',

            'user_add',
            'user_drop',
            'user_edit',

            'user_role_add',
            'user_role_drop',
            'user_role_edit',

            'role_add',
            'role_drop',
            'role_edit',

            'role_permission_add',
            'role_permission_drop',
        ];
        const permissions : AuthPermission[] = names.map((id: string) => {
            return permissionRepository.create({id});
        });

        await permissionRepository.save(permissions);

        //-------------------------------------------------

        /**
         * Assign all permissions to default role.
         */
        const rolePermissionRepository = connection.getRepository(AuthRolePermission);
        const rolePermissions : AuthRolePermission[] = [];
        for(let j=0; j<permissions.length; j++) {
            rolePermissions.push(rolePermissionRepository.create({
                role_id: adminRole.id,
                permission_id: permissions[j].id
            }))
        }

        await rolePermissionRepository.save(rolePermissions);
    }
}
