import { logError } from "@/lib/logger";
import { TConsoleFeatureRepository } from "./console-features.repository";

type TConsoleFeatureServiceDeps = {
  ConsoleFeatureRepository: TConsoleFeatureRepository;
};

export const ConsoleFeatureServices = ({
  ConsoleFeatureRepository,
}: TConsoleFeatureServiceDeps) => {
  const CreateFeature = async (entry: { name: string; slug: string }) => {
    try {
      const existingFeature = await ConsoleFeatureRepository.FindEntryBySlug(
        entry.slug,
      );
      if (existingFeature) {
        throw new Error("Feature already existing");
      }
      const newFeature = await ConsoleFeatureRepository.CreateEntry(entry);
      return newFeature;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed creating feature");
    }
  };

  const FindFeatureById = async (id: string) => {
    try {
      const feature = await ConsoleFeatureRepository.FindEntryById(id);
      return feature;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed finding feature");
    }
  };

  const FindFeatures = async () => {
    try {
      const features = await ConsoleFeatureRepository.FindEntries();
      return features;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed fetching features");
    }
  };

  const FindFeatureBySlug = async (slug: string) => {
    try {
      const feature = await ConsoleFeatureRepository.FindEntryBySlug(slug);
      return feature;
    } catch (err) {
      logError(err);
      throw new Error((err as Error).message ?? "Failed finding feature");
    }
  };

  return {
    CreateFeature,
    FindFeatureById,
    FindFeatures,
    FindFeatureBySlug,
  };
};

export type TConsoleFeatureServices = ReturnType<typeof ConsoleFeatureServices>;
