import type { RepositoryContext } from "../datastore/repository";
import { BaseRepository } from "../datastore/repository";

export const MembershipClubChargeCenterRepository = (
  ctx: RepositoryContext,
) => {
  const repo = new BaseRepository(ctx);

  const CreateMembershipChargeCenter = async (
    name: string,
    currency: string,
    viewpoint_charge_center_id: string,
    note?: string,
  ) => {
    try {
      const newRecord = await repo.datastore
        .insertInto("membership_club_charge_centers")
        .values({
          name,
          currency,
          viewpoint_charge_center_id,
          note,
        })
        .returningAll()
        .executeTakeFirstOrThrow();
      return newRecord;
    } catch (err) {
      throw err;
    }
  };

  const SearchMembershipChargeCenters = async () => {
    try {
      const records = await repo.datastore
        .selectFrom("membership_club_charge_centers as mccc")
        .select([
          "mccc.id",
          "mccc.name",
          "mccc.currency",
          "mccc.viewpoint_charge_center_id",
          "mccc.note",
          "mccc.created_at",
          "mccc.updated_at",
        ])
        .execute();
      return records;
    } catch (err) {
      throw err;
    }
  };

  const FindMembershipChargeCenter = async (id: string) => {
    try {
      const record = await repo.datastore
        .selectFrom("membership_club_charge_centers as mccc")
        .select([
          "mccc.id",
          "mccc.name",
          "mccc.currency",
          "mccc.viewpoint_charge_center_id",
          "mccc.note",
          "mccc.created_at",
          "mccc.updated_at",
        ])
        .where("mccc.id", "=", id)
        .execute();
      return record[0];
    } catch (err) {
      throw err;
    }
  };

  const UpdateMembershipChargeCenter = async (
    id: string,
    update: {
      name?: string;
      currency?: string;
      viewpoint_charge_center_id?: string;
      note?: string;
    },
  ) => {
    try {
      const existingRecord = await repo.datastore
        .selectFrom("membership_club_charge_centers as mccc")
        .select(["mccc.id"])
        .where("id", "=", id)
        .executeTakeFirstOrThrow();
      const updatedRecord = await repo.datastore
        .updateTable("membership_club_charge_centers")
        .set(update)
        .where("id", "=", existingRecord.id)
        .returningAll()
        .executeTakeFirstOrThrow();
      return updatedRecord;
    } catch (err) {
      throw err;
    }
  };

  const RemoveMembershipChargeCenter = async (id: string) => {
    try {
      await repo.datastore
        .deleteFrom("membership_club_charge_centers")
        .where("id", "=", id)
        .execute();
    } catch (err) {
      throw err;
    }
  };

  return {
    CreateMembershipChargeCenter,
    SearchMembershipChargeCenters,
    FindMembershipChargeCenter,
    UpdateMembershipChargeCenter,
    RemoveMembershipChargeCenter,
  };
};
