import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { PermissionService } from './permissions/permission.service';
import { RoleService } from './roles/role.service';
import { permissionsSeed } from './seed/permission.seed';
import { CreatePermissionDto } from './permissions/dto/create-permission.dto';
import { CreateSubPermissionDto } from './permissions/dto/create-sub-permisison.dto';

@Injectable()
export class RolePermissionService implements OnModuleInit {
  private readonly logger = new Logger(RolePermissionService.name);

  constructor(
    private readonly permissionService: PermissionService,
    private readonly roleService: RoleService,
  ) {
    this.logger.log('RolePermissionService initialized');
  }

  async onModuleInit() {
    this.logger.log('Seeding permissions and sub-permissions...');

    for (const permissionSeed of permissionsSeed) {
      try {
        // Check if permission already exists
        const existingPermission = await this.permissionService.findPermissionByName(permissionSeed.name).catch(() => null);

        let createdPermission;
        if (!existingPermission) {
          const createPermissionDto: CreatePermissionDto = {
            name: permissionSeed.name,
            displayName: permissionSeed.displayName,
            description: permissionSeed.description,
            permissionType: permissionSeed.permissionType,
            isActive: permissionSeed.isActive ?? true,
            isSystemPermission: permissionSeed.isSystemPermission ?? false,
            isClientPermission: permissionSeed.isClientPermission ?? false,
          };

          createdPermission = await this.permissionService.createPermission(createPermissionDto);
          this.logger.log(`Created permission: ${permissionSeed.name}`);
        } else {
          createdPermission = existingPermission;
          this.logger.log(`Permission already exists: ${permissionSeed.name}`);
        }

        // Seed sub-permissions if any
        if (permissionSeed.subPermissions && permissionSeed.subPermissions.length > 0) {
          for (const subPermSeed of permissionSeed.subPermissions) {
            try {
              const existingSubPermission = await this.permissionService.findSubPermissionByName(subPermSeed.name).catch(() => null);
              if (!existingSubPermission) {
                const createSubPermissionDto: CreateSubPermissionDto = {
                  name: subPermSeed.name,
                  displayName: subPermSeed.displayName,
                  description: subPermSeed.description,
                  permissionType: subPermSeed.permissionType,
                  isActive: subPermSeed.isActive ?? true,
                  isSystemPermission: subPermSeed.isSystemPermission ?? false,
                  isClientPermission: subPermSeed.isClientPermission ?? false,
                  permissionId: createdPermission.id, // link to parent permission
                };

                await this.permissionService.createSubPermission(createSubPermissionDto);
                this.logger.log(`Created sub-permission: ${subPermSeed.name} under ${permissionSeed.name}`);
              } else {
                this.logger.log(`Sub-permission already exists: ${subPermSeed.name}`);
              }
            } catch (subPermError) {
              this.logger.error(`Failed to create sub-permission ${subPermSeed.name}: ${subPermError.message}`, subPermError.stack);
            }
          }
        }
      } catch (permissionError) {
        this.logger.error(`Failed to create permission ${permissionSeed.name}: ${permissionError.message}`, permissionError.stack);
      }
    }

    this.logger.log('Permissions seeding completed');
  }
}
