import { getActiveClient } from '~/client/api/activeClient';
import { ingestInCache } from '~/cache/api/ingestInCache';
import { fireEvent } from '~/core/events';
import { prepareMembershipPayload } from '~/group/utils';
import { ContentFlagReasonEnum } from '~/@types';

/* begin_public_function
  id: post.flag
*/
/**
 * ```js
 * import { PostRepository } from '@amityco/ts-sdk'
 * const flagged = await PostRepository.flagPost(postId, reason)
 * ```
 *
 * @param postId of the post to flag
 * @param reason the reason to flag the post
 * @returns a boolean
 *
 * @category Post API
 * @async
 * */
export const flagPost = async (
  postId: Amity.Post['postId'],
  reason?: Amity.ContentFlagReason,
): Promise<boolean> => {
  const client = getActiveClient();
  client.log('post/flagPost', postId);

  const isPredefinedReason =
    reason &&
    Object.entries(ContentFlagReasonEnum).some(
      ([key, value]) => key !== ContentFlagReasonEnum.Others && value === reason,
    );

  const body = {
    reason: reason && isPredefinedReason ? reason : ContentFlagReasonEnum.Others,
    detail: reason && !isPredefinedReason ? reason : '',
  };

  const { data: payload } = await client.http.post<Amity.PostPayload>(
    `/api/v3/posts/${encodeURIComponent(postId)}/flag`,
    body,
  );

  if (client.cache) {
    ingestInCache(prepareMembershipPayload(payload, 'communityUsers'));
  }

  fireEvent('post.flagged', payload);

  return !!payload;
};
/* end_public_function */
