import { Injectable } from "@nestjs/common"
import { InjectRepository } from "@nestjs/typeorm"
import { Modules } from "src/modules/module/entities/module.entity"
import { Permission } from "src/modules/permission/entities/permission.entity"
import { RolePermission } from "src/modules/role-permission/entities/role-permission.entity"
import { Role } from "src/modules/role/entities/role.entity"
import { Repository } from "typeorm"

@Injectable()
export class RolePermissionSeedService {
  constructor(
    @InjectRepository(RolePermission)
    private readonly rolePermissionRepo: Repository<RolePermission>,
    @InjectRepository(Role)
    private readonly roleRepo: Repository<Role>,
    @InjectRepository(Permission)
    private readonly permissionRepo: Repository<Permission>,
    @InjectRepository(Modules)
    private readonly moduleRepo: Repository<Modules>,
  ) {}

  async run() {
    try {
      // Fetch Super Admin role
      const superAdminRole = await this.roleRepo.findOne({
        where: { name: "Super Admin" },
      })

      if (!superAdminRole) {
        console.log("Super Admin role not found. Please seed roles first.")
        return
      }

      // Fetch admin permission
      const adminPermission = await this.permissionRepo.findOne({
        where: { permission_type: "admin" },
      })

      if (!adminPermission) {
        console.log(
          "Admin permission not found. Please seed permissions first.",
        )
        return
      }

      // Fetch all modules
      const modules = await this.moduleRepo.find()

      if (modules.length === 0) {
        console.log("No modules found. Please seed modules first.")
        return
      }

      const rolePermissions: Partial<RolePermission>[] = []

      for (const module of modules) {
        const exists = await this.rolePermissionRepo.findOne({
          where: {
            role_id: superAdminRole.id,
            module_id: module.id,
            permission_id: adminPermission.id,
          },
        })

        if (!exists) {
          rolePermissions.push({
            role_id: superAdminRole.id,
            module_id: module.id,
            permission_id: adminPermission.id,
          })
          console.log(
            `Role permission for Super Admin -> ${module.module_name} prepared for seeding...`,
          )
        } else {
          console.log(
            `Role permission for Super Admin -> ${module.module_name} already exists, skipping...`,
          )
        }
      }

      // Save all role permissions
      if (rolePermissions.length > 0) {
        await this.rolePermissionRepo.save(rolePermissions)
        console.log(
          `Successfully seeded ${rolePermissions.length} role permissions for Super Admin`,
        )
      } else {
        console.log("All role permissions already exist")
      }
    } catch (error) {
      console.error("Error seeding role permissions:", error)
    }
  }
}
