import { fireEvent } from '~/core/events';
import { InvitationStatusEnum } from '~/@types';
import { pullFromCache, upsertInCache } from '~/cache/api';
import { getActiveClient } from '~/client/api/activeClient';

/* begin_public_function
  id: invitation.reject
*/
/**
 * ```js
 * import { rejectInvitation } from '@amityco/ts-sdk'
 * const isRejected = await rejectInvitation(invitationId)
 * ```
 *
 * Rejects a {@link Amity.Invitation} object
 *
 * @param invitationId the {@link Amity.Invitation} to reject
 * @returns A success boolean if the {@link Amity.Invitation} was rejected
 *
 * @category Invitation API
 * @async
 */
export const rejectInvitation = async (invitationId: Amity.Invitation['_id']): Promise<boolean> => {
  const client = getActiveClient();
  client.log('invitation/rejectInvitation', invitationId);

  const { data } = await client.http.post<{ success: boolean }>(
    `/api/v1/invitations/${invitationId}/reject`,
  );

  const invitation = pullFromCache<Amity.InternalInvitation>([
    'invitation',
    'get',
    invitationId,
  ])?.data;

  if (invitation) {
    upsertInCache(['invitation', 'get', invitationId], { status: InvitationStatusEnum.Rejected });

    fireEvent('local.invitation.updated', [invitation]);
  }

  return data.success;
};
/* end_public_function */
