import { dataSource } from "../../../data-source";
import { membershipStatus } from "../../../entity/settings/membershipStatus";
import InternalException from "../../../exceptions/internalException";
import {
  CreateMembershipStatusCommand,
  DeleteMembershipStatusCommand,
  UpdateMembershipStatusCommand,
} from "./membershipStatusCommand";

export default abstract class MembershipStatusCommandHandler {
  /**
   * @description create membershipStatus
   * @param {CreateMembershipStatusCommand} createMembershipStatus
   * @returns {Promise<number>}
   */
  static async create(createMembershipStatus: CreateMembershipStatusCommand): Promise<number> {
    return await dataSource
      .createQueryBuilder()
      .insert()
      .into(membershipStatus)
      .values({
        status: createMembershipStatus.status,
      })
      .execute()
      .then((result) => {
        return result.identifiers[0].id;
      })
      .catch((err) => {
        throw new InternalException("Failed creating membershipStatus", err);
      });
  }

  /**
   * @description update membershipStatus
   * @param {UpdateMembershipStatusCommand} updateMembershipStatus
   * @returns {Promise<void>}
   */
  static async update(updateMembershipStatus: UpdateMembershipStatusCommand): Promise<void> {
    return await dataSource
      .createQueryBuilder()
      .update(membershipStatus)
      .set({
        status: updateMembershipStatus.status,
      })
      .where("id = :id", { id: updateMembershipStatus.id })
      .execute()
      .then(() => {})
      .catch((err) => {
        throw new InternalException("Failed updating membershipStatus", err);
      });
  }

  /**
   * @description delete membershipStatus
   * @param {DeleteMembershipStatusCommand} deleteMembershipStatus
   * @returns {Promise<void>}
   */
  static async delete(deleteMembershipStatus: DeleteMembershipStatusCommand): Promise<void> {
    return await dataSource
      .createQueryBuilder()
      .delete()
      .from(membershipStatus)
      .where("id = :id", { id: deleteMembershipStatus.id })
      .execute()
      .then(() => {})
      .catch((err) => {
        throw new InternalException("Failed deleting membershipStatus", err);
      });
  }
}