/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import {defer} from '../base/deferred';

enum WebContentScriptMessageType {
  UNKNOWN,
  CONVERT_OBJECT_URL,
  CONVERT_OBJECT_URL_RESPONSE,
}

const ANDROID_BUG_TOOL_EXTENSION_ID = 'mbbaofdfoekifkfpgehgffcpagbbjkmj';

interface Attachment {
  name: string;
  objectUrl: string;
  restrictionSeverity: number;
}

interface ConvertObjectUrlResponse {
  action: WebContentScriptMessageType.CONVERT_OBJECT_URL_RESPONSE;
  attachments: Attachment[];
  issueAccessLevel: string;
  issueId: string;
  issueTitle: string;
}

export interface TraceFromBuganizer {
  issueId: string;
  issueTitle: string;
  file: File;
}

export function loadAndroidBugToolInfo(): Promise<TraceFromBuganizer> {
  const deferred = defer<TraceFromBuganizer>();

  // Request to convert the blob object url "blob:chrome-extension://xxx"
  // the chrome extension has to a web downloadable url "blob:http://xxx".
  chrome.runtime.sendMessage(
    ANDROID_BUG_TOOL_EXTENSION_ID,
    {action: WebContentScriptMessageType.CONVERT_OBJECT_URL},
    async (response: ConvertObjectUrlResponse) => {
      switch (response.action) {
      case WebContentScriptMessageType.CONVERT_OBJECT_URL_RESPONSE:
        if (response.attachments?.length > 0) {
          const filesBlobPromises =
                response.attachments.map(async (attachment) => {
                  const fileQueryResponse = await fetch(attachment.objectUrl);
                  const blob = await fileQueryResponse.blob();
                  // Note: The blob's media type is always set to "image/png".
                  // Clone blob to clear media type.
                  return new File([blob], attachment.name);
                });
          const files = await Promise.all(filesBlobPromises);
          deferred.resolve({
            issueId: response.issueId,
            issueTitle: response.issueTitle,
            file: files[0],
          });
        } else {
          throw new Error('Got no attachements from extension');
        }
        break;
      default:
        throw new Error(`Received unhandled response code (${
          response.action}) from extension.`);
      }
    });
  return deferred;
}
