import { pullFromCache } from '~/cache/api';
import { userLinkedObject } from './userLinkedObject';
import { acceptInvitation, rejectInvitation } from '~/invitationRepository/internalApi';

export const invitationLinkedObject = (invitation: Amity.InternalInvitation): Amity.Invitation => {
  return {
    ...invitation,
    get user(): Amity.User | undefined {
      const cacheData = pullFromCache<Amity.User>(['user', 'get', invitation.invitedUserPublicId]);
      if (cacheData?.data) return userLinkedObject(cacheData.data);
      return undefined;
    },
    get createdBy(): Amity.User | undefined {
      const cacheData = pullFromCache<Amity.User>(['user', 'get', invitation.inviterUserPublicId]);
      if (cacheData?.data) return userLinkedObject(cacheData.data);
      return undefined;
    },
    get target(): Amity.InvitationTarget<Amity.InvitationTargetType> | undefined {
      if (invitation.targetType === 'community') {
        const cacheData = pullFromCache<Amity.InternalCommunity>([
          'community',
          'get',
          invitation.targetId,
        ]);
        if (cacheData?.data) return cacheData.data;
        return undefined;
      }
      return undefined;
    },
    accept: async () => {
      await acceptInvitation(invitation._id);
    },
    reject: async () => {
      await rejectInvitation(invitation._id);
    },
  };
};
