import { DatabaseError } from "@/lib/error";
import { logError } from "@/lib/logger";
import { BaseRepository, RepositoryContext } from "../datastore/repository";

export const ConsoleRolePrivilegesRepository = (ctx: RepositoryContext) => {
  const { datastore } = new BaseRepository(ctx);

  const FindEntriesByRoleId = async (roleId: string | string[]) => {
    try {
      const records = await datastore
        .selectFrom("console_role_privileges as crp")
        .where((eb) =>
          Array.isArray(roleId)
            ? eb("crp.console_role_id", "in", roleId)
            : eb("crp.console_role_id", "=", roleId),
        )
        .innerJoin("console_features as cf", "cf.id", "crp.console_feature_id")
        .innerJoin("console_roles as cr", "cr.id", "crp.console_role_id")
        .select([
          "crp.console_feature_id",
          "crp.console_role_id",
          "crp.create",
          "crp.read",
          "crp.update",
          "crp.delete",
          "cf.name as feature_name",
          "cf.slug as feature_slug",
          "cr.name as role_name",
          "cr.description as role_description",
        ])
        .execute();

      return records;
    } catch (err) {
      logError(err);
      throw new DatabaseError({
        error: err,
        message: "Failed to fetching role privileges by roleId",
      });
    }
  };

  return {
    FindEntriesByRoleId,
  };
};

export type TConsoleRolePrivilegesRepository = ReturnType<
  typeof ConsoleRolePrivilegesRepository
>;
