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

/* begin_public_function
  id: joinRequest.reject
*/
/**
 * ```js
 * import { joinRequest } from '@amityco/ts-sdk'
 * const isRejected = await joinRequest.reject()
 * ```
 *
 * Rejects a {@link Amity.JoinRequest} object
 *
 * @param joinRequest the {@link Amity.JoinRequest} to reject
 * @returns A success boolean if the {@link Amity.JoinRequest} was rejected
 *
 * @category Join Request API
 * @async
 */
export const rejectJoinRequest = async (
  joinRequest: Amity.InternalJoinRequest,
): Promise<boolean> => {
  const client = getActiveClient();
  client.log('joinRequest/rejectJoinRequest', joinRequest.joinRequestId);

  const { data } = await client.http.post<{ success: boolean }>(
    `/api/v4/communities/${joinRequest.targetId}/join/reject`,
    {
      userId: joinRequest.requestorInternalId,
    },
  );

  const joinRequestCache = pullFromCache<Amity.InternalJoinRequest>([
    'joinRequest',
    'get',
    joinRequest.joinRequestId,
  ])?.data;

  if (joinRequestCache) {
    upsertInCache(['joinRequest', 'get', joinRequest.joinRequestId], {
      status: JoinRequestStatusEnum.Rejected,
    });

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

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