import type { TMemberAccessPolicy } from "../member-access-policies/member-access-policy.types";
import type { TMembershipClubRepository } from "./membership-clubs.repository";

interface TMembershipClubServicesDeps {
  MembershipClubRepository: TMembershipClubRepository;
}

export const MembershipClubServices = ({
  MembershipClubRepository,
}: TMembershipClubServicesDeps) => {
  const CreateMembershipClub = async (entry: {
    name: string;
    club_id: string;
    account_types: { id: string }[];
    charge_centers: { id: string }[];
    statuses: {
      id: string;
      access_policies: TMemberAccessPolicy;
    }[];
    note?: string;
  }) => {
    try {
      const newMembershipClub =
        await MembershipClubRepository.CreateEntry(entry);
      return newMembershipClub;
    } catch (err) {
      throw err;
    }
  };

  const FindAllMembershipClubs = async () => {
    try {
      const records = await MembershipClubRepository.FindEntries();
      return records;
    } catch (err) {
      throw err;
    }
  };

  const FindMembershipClub = async (id: string) => {
    try {
      const record = await MembershipClubRepository.FindEntry(id);
      return record;
    } catch (err) {
      throw err;
    }
  };

  const UpdateMembershipClub = async (
    id: string,
    entry: {
      clubID?: string;
      clubName?: string;
      account_types?: {
        id: string;
      }[];
      note?: string;
      statuses?: {
        id: string;
        access_policies: TMemberAccessPolicy;
      }[];
      charge_centers?: {
        id: string;
      }[];
    },
  ) => {
    try {
      const record = await MembershipClubRepository.UpdateEntry(id, entry);
      return record;
    } catch (err) {
      throw err;
    }
  };

  const RemoveClubByID = async (id: string) => {
    try {
      await MembershipClubRepository.RemoveClubByID(id);
    } catch (err) {
      throw err;
    }
  };

  const GetClubStatusPolicy = async (
    clubID: string,
    ex_account_status_id: string,
  ) => {
    try {
      const record =
        await MembershipClubRepository.FindClubStatusPolicyByClubID(
          clubID,
          ex_account_status_id,
        );
      return record;
    } catch (err) {
      throw err;
    }
  };

  return {
    CreateMembershipClub,
    FindAllMembershipClubs,
    FindMembershipClub,
    UpdateMembershipClub,
    RemoveClubByID,
    GetClubStatusPolicy,
  };
};

export type TMembershipClubServices = ReturnType<typeof MembershipClubServices>;
