export {};

export const enum JoinRequestStatusEnum {
  Pending = 'pending',
  Approved = 'approved',
  Rejected = 'rejected',
  Cancelled = 'cancelled',
}

export const enum JoinResultStatusEnum {
  Success = 'success',
  Pending = 'pending',
}

declare global {
  namespace Amity {
    type JoinRequestStatus = JoinRequestStatusEnum;

    type JoinResultStatus = JoinResultStatusEnum;

    type JoinRequestType = 'communityJoinRequest';

    type JoinResult = {
      status: Amity.JoinResultStatus;
      request?: Amity.JoinRequest;
    };

    type RawJoinRequest = {
      _id: string;
      createdAt: Amity.timestamp;
      joinRequestId: string;
      networkId: string;

      requestorId: string;
      requestorInternalId: string;
      requestorPublicId: string;

      respondedAt: Amity.timestamp | null;
      responderId: string | null;
      responderInternalId: string | null;
      responderPublicId: string | null;

      status: Amity.JoinRequestStatus;
      targetId: string;
      targetType: string;
      type: Amity.JoinRequestType;
      updatedAt: Amity.timestamp;
      userId: string;
    };

    type InternalJoinRequest = Omit<RawJoinRequest, '_id'>;

    type JoinRequest = Omit<Amity.InternalJoinRequest, 'responderId'> &
      Amity.JoinRequestLinkedObject & {
        user?: Amity.User;
        feeds?: Amity.Feed[];
        files?: Amity.File[];
      };

    type JoinRequestLinkedObject = {
      cancel: () => Promise<void>;
      approve: () => Promise<void>;
      reject: () => Promise<void>;
    };
  }
}
