import { Injectable } from "@nestjs/common"
import { PermissionsService } from "../../../modules/permissions/permissions.service"
import { Permission } from "../../../modules/permissions/entities/permission.entity"
import { getAllPermissions } from "../../../constants/permissions.constant"
import { PermissionRepository } from "../../../modules/permissions/repositories/permission.repository"

@Injectable()
export class PermissionsSeedService {
  constructor(
    private readonly permissionsService: PermissionsService,
    private readonly permissionRepository: PermissionRepository,
  ) {}

  async run() {
    try {
      console.log("Starting permissions seeding...")

      // Get all permissions from constants
      const permissionsData = getAllPermissions()

      for (const permissionData of permissionsData) {
        console.log(`Processing permission: ${permissionData.permission_key}`)

        // Check if permission already exists
        const isPermissionExist =
          await this.permissionsService.checkPermissionExist(
            permissionData.group_key,
            permissionData.permission_key,
          )

        if (!isPermissionExist) {
          const permission = new Permission()
          permission.group_key = permissionData.group_key
          permission.permission_key = permissionData.permission_key
          permission.label = permissionData.label
          permission.description = permissionData.description
          permission.status = 1
          permission.created_by = null // System created
          permission.group_name = permissionData.group_name

          await this.permissionRepository.save(permission)
          console.log(`✅ Created permission: ${permissionData.permission_key}`)
        } else {
          // Update existing permission if needed
          const existingPermission: any =
            await this.permissionRepository.getByParams({
              where: {
                group_key: permissionData.group_key,
                permission_key: permissionData.permission_key,
              },
              whereNull: ["deleted_at"],
              findOne: true,
            })

          if (
            existingPermission &&
            (existingPermission.label !== permissionData.label ||
              existingPermission.description !== permissionData.description ||
              existingPermission.group_name !== permissionData.group_name)
          ) {
            existingPermission.label = permissionData.label
            existingPermission.description = permissionData.description
            existingPermission.group_name = permissionData.group_name
            await this.permissionRepository.save(existingPermission)
            console.log(
              `🔄 Updated permission: ${permissionData.permission_key}`,
            )
          } else {
            console.log(
              `⏭️  Permission already exists: ${permissionData.permission_key}`,
            )
          }
        }
      }

      console.log("✅ Permissions seeding completed successfully!")
    } catch (error) {
      console.error("❌ Error running Permissions seeder:", error)
      throw error
    }
  }
}
