import { InvitationTypeEnum } from '~/@types';
import { getMyJoinRequest } from '~/communityRepository/internalAPI/getMyJoinRequest';
import { joinRequest } from '~/communityRepository/internalAPI/joinCommunity';
import { getJoinRequests } from '~/communityRepository/observers/getJoinRequests';
import { createInvitations } from '~/invitationRepository/internalApi';
import { getInvitation } from '~/invitationRepository/internalApi/getInvitation';
import { getInvitations } from '~/invitationRepository/observers/getInvitations';

export const communityLinkedObject = (community: Amity.InternalCommunity): Amity.Community => {
  return {
    ...community,
    createInvitations: async (userIds: string[]): Promise<void> => {
      await createInvitations({
        type: InvitationTypeEnum.CommunityMemberInvite,
        targetType: 'community',
        targetId: community.communityId,
        userIds,
      });
    },
    getMemberInvitations: (
      params: Pick<Amity.InvitationLiveCollection, 'limit' | 'sortBy' | 'statuses'>,
      callback: Amity.LiveCollectionCallback<Amity.Invitation>,
    ): Amity.Unsubscriber => {
      return getInvitations(
        {
          ...params,
          targetId: community.communityId,
          targetType: 'community',
          type: InvitationTypeEnum.CommunityMemberInvite,
        },
        callback,
      );
    },
    getInvitation: async () => {
      const { data } = await getInvitation('community', community.communityId);
      return data;
    },
    join: async () => joinRequest(community.communityId),

    getJoinRequests: (
      params: Omit<Amity.QueryJoinRequest, 'communityId'>,
      callback: Amity.LiveCollectionCallback<Amity.JoinRequest>,
    ): Amity.Unsubscriber => {
      return getJoinRequests(
        {
          ...params,
          communityId: community.communityId,
        },
        callback,
      );
    },
    getMyJoinRequest: async () => {
      const { data } = await getMyJoinRequest(community.communityId);
      return data;
    },
  };
};
