import AbortController from 'abort-controller';
import { OpenGroupData } from '../../../../data/opengroups';
import { OnionSending } from '../../../onions/onionSend';
import { OpenGroupRequestCommonType } from '../opengroupV2/ApiUtil';
import { batchGlobalIsSuccess } from './sogsV3BatchPoll';
import { roomHasBlindEnabled } from './sogsV3Capabilities';

/**
 * Returns the id on which the file is saved, or null
 */
export const uploadFileToRoomSogs3 = async (
  fileContent: Uint8Array,
  roomInfos: OpenGroupRequestCommonType
): Promise<{ fileId: number; fileUrl: string } | null> => {
  if (!fileContent || !fileContent.length) {
    return null;
  }

  const roomDetails = OpenGroupData.getV2OpenGroupRoomByRoomId(roomInfos);
  if (!roomDetails || !roomDetails.serverPublicKey) {
    window.log.warn('uploadFileOpenGroupV3: roomDetails is invalid');
    return null;
  }

  const result = await OnionSending.sendBinaryViaOnionV4ToSogs({
    abortSignal: new AbortController().signal,
    blinded: roomHasBlindEnabled(roomDetails),
    bodyBinary: fileContent,
    headers: null,
    serverPubkey: roomDetails.serverPublicKey,
    endpoint: `/room/${roomDetails.roomId}/file`,
    method: 'POST',
    serverUrl: roomDetails.serverUrl,
  });

  if (!batchGlobalIsSuccess(result)) {
    return null;
  }

  const fileId = (result?.body as any | undefined)?.id as number | undefined;
  if (!fileId) {
    return null;
  }
  const fileUrl = `${roomInfos.serverUrl}/room/${roomDetails.roomId}/file/${fileId}`;

  return {
    fileId,
    fileUrl,
  };
};