import { logError } from "@/lib/logger";
import { TConsoleUserRolesRepository } from "./console-user-roles.repository";

type TConsoleUserRolesServiceDeps = {
  ConsoleUserRolesRepository: TConsoleUserRolesRepository;
};

export const ConsoleUserRolesServices = ({
  ConsoleUserRolesRepository,
}: TConsoleUserRolesServiceDeps) => {
  const CreateUserRole = async (
    entry: { userId: string; roleId: string }[],
  ) => {
    try {
      let filteredEntries = [];
      for (const e of entry) {
        // filter out existing entries
        const existingEntry =
          await ConsoleUserRolesRepository.FindEntriesByUserIdAndRoleId(
            e.userId,
            e.roleId,
          );
        if (!existingEntry) {
          filteredEntries.push(e);
        }
      }
      if (filteredEntries.length === 0) {
        throw new Error("User already has the specified roles");
      }
      const newUserRoles =
        await ConsoleUserRolesRepository.CreateEntries(filteredEntries);
      return newUserRoles;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed creating user role");
    }
  };

  const DeleteUserRolesByUserId = async (userId: string) => {
    try {
      const deletedEntries =
        await ConsoleUserRolesRepository.DeleteEntriesByUserId(userId);
      return deletedEntries;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed deleting user roles");
    }
  };

  const FindUserRolesByUserId = async (userId: string) => {
    try {
      const records =
        await ConsoleUserRolesRepository.FindEntriesByUserId(userId);
      return records;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed finding user roles");
    }
  };

  const FindUsersByRoleId = async (roleId: string) => {
    try {
      const records =
        await ConsoleUserRolesRepository.FindEntriesByRoleId(roleId);
      return records;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed finding users by role");
    }
  };

  return {
    CreateUserRole,
    DeleteUserRolesByUserId,
    FindUserRolesByUserId,
    FindUsersByRoleId,
  };
};

export type TConsoleUserRolesServices = ReturnType<
  typeof ConsoleUserRolesServices
>;
