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

export const ConsoleFeatureRepository = (ctx: RepositoryContext) => {
  const { datastore } = new BaseRepository(ctx);
  const CreateEntry = async (entry: { name: string; slug: string }) => {
    try {
      const newEntry = await datastore
        .insertInto("console_features")
        .values({
          name: entry.name,
          slug: entry.slug,
        })
        .returningAll()
        .execute();
      return newEntry;
    } catch (err) {
      logError(err);
      throw new DatabaseError({
        error: err,
        message: "Failed to create feature",
      });
    }
  };

  const FindEntryById = async (id: string) => {
    try {
      const record = await datastore
        .selectFrom("console_features")
        .selectAll()
        .executeTakeFirstOrThrow();
      return record;
    } catch (err) {
      logError(err);
      throw new DatabaseError({
        error: err,
        message: "Failed to fetching feature",
      });
    }
  };

  const FindEntryBySlug = async (slug: string) => {
    try {
      const record = await datastore
        .selectFrom("console_features")
        .where("slug", "=", slug)
        .selectAll()
        .executeTakeFirst();
      return record;
    } catch (err) {
      logError(err);
      throw new DatabaseError({
        error: err,
        message: "Failed to fetching feature",
      });
    }
  };

  const FindEntries = async () => {
    try {
      const records = await datastore
        .selectFrom("console_features")
        .selectAll()
        .execute();
      return records;
    } catch (err) {
      logError(err);
      throw new DatabaseError({
        error: err,
        message: "Failed fetching features",
      });
    }
  };
  return {
    CreateEntry,
    FindEntryById,
    FindEntries,
    FindEntryBySlug,
  };
};

export type TConsoleFeatureRepository = ReturnType<
  typeof ConsoleFeatureRepository
>;
