import { Injectable } from "@nestjs/common"
import { InjectRepository } from "@nestjs/typeorm"
import { Repository } from "typeorm"
import { BaseAbstractRepository } from "../../../common/repository/base.repository"
import { RolePermission } from "../entities/role-permission.entity"
import { FindAllRolePermissionDto } from "../dto/find-all-role-permission.dto"

@Injectable()
export class RolePermissionRepository extends BaseAbstractRepository<RolePermission> {
  constructor(
    @InjectRepository(RolePermission)
    private readonly rolePermissionRepository: Repository<RolePermission>,
  ) {
    super(rolePermissionRepository)
  }
  async getFullRolePermissions(params: FindAllRolePermissionDto) {
    const validSortColumns = ["id", "created_at", "updated_at"]

    const sortColumn = validSortColumns.includes(params.sortBy)
      ? params.sortBy
      : "created_at"
    const sortOrder: "ASC" | "DESC" = params.sortOrder || "DESC"

    // Create query builder
    const queryBuilder =
      this.rolePermissionRepository.createQueryBuilder("rolePermission")

    // Add joins with correct property names
    queryBuilder
      .leftJoinAndSelect("rolePermission.role", "role")
      .leftJoinAndSelect("role.department", "department")
      .leftJoinAndSelect("role.business_vertical", "businessVertical")
      .leftJoinAndSelect("rolePermission.module", "module")
      .leftJoinAndSelect("rolePermission.permission", "permission")

    // Add pagination
    queryBuilder
      .take(Number(params.limit || 10))
      .skip(Number(params.skip || 0))
      .orderBy(`rolePermission.${sortColumn}`, sortOrder)

    // Execute query
    return await queryBuilder.getMany()
  }

  async findOneRolePermissionByRoleIdAndModuleId(
    roleId: number,
    moduleId: number,
  ): Promise<RolePermission> {
    // Create query builder
    const queryBuilder =
      this.rolePermissionRepository.createQueryBuilder("rolePermission")

    // Add joins with correct property names
    queryBuilder
      .leftJoinAndSelect("rolePermission.role", "role")
      .leftJoinAndSelect("rolePermission.module", "module")
      .leftJoinAndSelect("rolePermission.permission", "permission")

    // Add where condition to filter by both role_id and module_id
    queryBuilder
      .where("rolePermission.role_id = :roleId", { roleId })
      .andWhere("rolePermission.module_id = :moduleId", { moduleId })

    // Execute query
    const rolePermission = await queryBuilder.getOne()

    if (!rolePermission) {
      throw new Error("Role permission not found")
    }

    return rolePermission
  }
}
