// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/browser/api/audio/audio_service_utils.h"

#include "base/ranges/algorithm.h"

namespace extensions {

api::audio::StreamType ConvertStreamTypeFromMojom(
    crosapi::mojom::StreamType type) {
  switch (type) {
    case crosapi::mojom::StreamType::kNone:
      return api::audio::StreamType::kNone;
    case crosapi::mojom::StreamType::kInput:
      return api::audio::StreamType::kInput;
    case crosapi::mojom::StreamType::kOutput:
      return api::audio::StreamType::kOutput;
  }
  NOTREACHED();
  return api::audio::StreamType::kNone;
}

crosapi::mojom::StreamType ConvertStreamTypeToMojom(
    api::audio::StreamType type) {
  switch (type) {
    case api::audio::StreamType::kNone:
      return crosapi::mojom::StreamType::kNone;
    case api::audio::StreamType::kInput:
      return crosapi::mojom::StreamType::kInput;
    case api::audio::StreamType::kOutput:
      return crosapi::mojom::StreamType::kOutput;
  }
  NOTREACHED();
  return crosapi::mojom::StreamType::kNone;
}

api::audio::DeviceType ConvertDeviceTypeFromMojom(
    crosapi::mojom::DeviceType type) {
  switch (type) {
    case crosapi::mojom::DeviceType::kNone:
      return api::audio::DeviceType::kNone;
    case crosapi::mojom::DeviceType::kHeadphone:
      return api::audio::DeviceType::kHeadphone;
    case crosapi::mojom::DeviceType::kMic:
      return api::audio::DeviceType::kMic;
    case crosapi::mojom::DeviceType::kUsb:
      return api::audio::DeviceType::kUsb;
    case crosapi::mojom::DeviceType::kBluetooth:
      return api::audio::DeviceType::kBluetooth;
    case crosapi::mojom::DeviceType::kHdmi:
      return api::audio::DeviceType::kHdmi;
    case crosapi::mojom::DeviceType::kInternalSpeaker:
      return api::audio::DeviceType::kInternalSpeaker;
    case crosapi::mojom::DeviceType::kInternalMic:
      return api::audio::DeviceType::kInternalMic;
    case crosapi::mojom::DeviceType::kFrontMic:
      return api::audio::DeviceType::kFrontMic;
    case crosapi::mojom::DeviceType::kRearMic:
      return api::audio::DeviceType::kRearMic;
    case crosapi::mojom::DeviceType::kKeyboardMic:
      return api::audio::DeviceType::kKeyboardMic;
    case crosapi::mojom::DeviceType::kHotword:
      return api::audio::DeviceType::kHotword;
    case crosapi::mojom::DeviceType::kLineout:
      return api::audio::DeviceType::kLineout;
    case crosapi::mojom::DeviceType::kPostMixLoopback:
      return api::audio::DeviceType::kPostMixLoopback;
    case crosapi::mojom::DeviceType::kPostDspLoopback:
      return api::audio::DeviceType::kPostDspLoopback;
    case crosapi::mojom::DeviceType::kAlsaLoopback:
      return api::audio::DeviceType::kAlsaLoopback;
    case crosapi::mojom::DeviceType::kOther:
      return api::audio::DeviceType::kOther;
  }
  NOTREACHED();
  return api::audio::DeviceType::kNone;
}

crosapi::mojom::DeviceType ConvertDeviceTypeToMojom(
    api::audio::DeviceType type) {
  switch (type) {
    case api::audio::DeviceType::kNone:
      return crosapi::mojom::DeviceType::kNone;
    case api::audio::DeviceType::kHeadphone:
      return crosapi::mojom::DeviceType::kHeadphone;
    case api::audio::DeviceType::kMic:
      return crosapi::mojom::DeviceType::kMic;
    case api::audio::DeviceType::kUsb:
      return crosapi::mojom::DeviceType::kUsb;
    case api::audio::DeviceType::kBluetooth:
      return crosapi::mojom::DeviceType::kBluetooth;
    case api::audio::DeviceType::kHdmi:
      return crosapi::mojom::DeviceType::kHdmi;
    case api::audio::DeviceType::kInternalSpeaker:
      return crosapi::mojom::DeviceType::kInternalSpeaker;
    case api::audio::DeviceType::kInternalMic:
      return crosapi::mojom::DeviceType::kInternalMic;
    case api::audio::DeviceType::kFrontMic:
      return crosapi::mojom::DeviceType::kFrontMic;
    case api::audio::DeviceType::kRearMic:
      return crosapi::mojom::DeviceType::kRearMic;
    case api::audio::DeviceType::kKeyboardMic:
      return crosapi::mojom::DeviceType::kKeyboardMic;
    case api::audio::DeviceType::kHotword:
      return crosapi::mojom::DeviceType::kHotword;
    case api::audio::DeviceType::kLineout:
      return crosapi::mojom::DeviceType::kLineout;
    case api::audio::DeviceType::kPostMixLoopback:
      return crosapi::mojom::DeviceType::kPostMixLoopback;
    case api::audio::DeviceType::kPostDspLoopback:
      return crosapi::mojom::DeviceType::kPostDspLoopback;
    case api::audio::DeviceType::kAlsaLoopback:
      return crosapi::mojom::DeviceType::kAlsaLoopback;
    case api::audio::DeviceType::kOther:
      return crosapi::mojom::DeviceType::kOther;
  }
  NOTREACHED();
  return crosapi::mojom::DeviceType::kNone;
}

std::unique_ptr<api::audio::DeviceFilter> ConvertDeviceFilterFromMojom(
    const crosapi::mojom::DeviceFilterPtr& filter) {
  if (!filter) {
    return nullptr;
  }

  auto result = std::make_unique<api::audio::DeviceFilter>();
  switch (filter->includedActiveState) {
    case crosapi::mojom::DeviceFilter::ActiveState::kUnset:
      result->is_active = absl::nullopt;
      break;
    case crosapi::mojom::DeviceFilter::ActiveState::kInactive:
      result->is_active = false;
      break;
    case crosapi::mojom::DeviceFilter::ActiveState::kActive:
      result->is_active = true;
      break;
  }

  if (filter->includedStreamTypes) {
    result->stream_types.emplace(filter->includedStreamTypes->size());
    base::ranges::transform(*filter->includedStreamTypes,
                            result->stream_types->begin(),
                            ConvertStreamTypeFromMojom);
  }

  return result;
}

crosapi::mojom::DeviceFilterPtr ConvertDeviceFilterToMojom(
    const api::audio::DeviceFilter* filter) {
  auto result = crosapi::mojom::DeviceFilter::New();

  if (!filter) {
    return result;
  }

  if (filter->is_active) {
    result->includedActiveState =
        *(filter->is_active)
            ? crosapi::mojom::DeviceFilter::ActiveState::kActive
            : crosapi::mojom::DeviceFilter::ActiveState::kInactive;
  } else {
    result->includedActiveState =
        crosapi::mojom::DeviceFilter::ActiveState::kUnset;
  }

  if (filter->stream_types) {
    result->includedStreamTypes =
        std::vector<crosapi::mojom::StreamType>(filter->stream_types->size());
    base::ranges::transform(*filter->stream_types,
                            result->includedStreamTypes->begin(),
                            ConvertStreamTypeToMojom);
  }
  return result;
}

api::audio::AudioDeviceInfo ConvertAudioDeviceInfoFromMojom(
    const crosapi::mojom::AudioDeviceInfoPtr& info) {
  DCHECK(info);
  api::audio::AudioDeviceInfo result;
  result.id = info->id;
  result.stream_type = ConvertStreamTypeFromMojom(info->streamType);
  result.device_type = ConvertDeviceTypeFromMojom(info->deviceType);
  result.display_name = info->displayName;
  result.device_name = info->deviceName;
  result.is_active = info->isActive;
  result.level = info->level;
  result.stable_device_id = info->stableDeviceId;
  return result;
}

crosapi::mojom::AudioDeviceInfoPtr ConvertAudioDeviceInfoToMojom(
    const api::audio::AudioDeviceInfo& info) {
  auto result = crosapi::mojom::AudioDeviceInfo::New();
  result->deviceName = info.device_name;
  result->deviceType = ConvertDeviceTypeToMojom(info.device_type);
  result->displayName = info.display_name;
  result->id = info.id;
  result->isActive = info.is_active;
  result->level = info.level;
  if (info.stable_device_id) {
    result->stableDeviceId = *(info.stable_device_id);
  }
  result->streamType = ConvertStreamTypeToMojom(info.stream_type);
  return result;
}

crosapi::mojom::DeviceIdListsPtr ConvertDeviceIdListsToMojom(
    const DeviceIdList* input_devices,
    const DeviceIdList* output_devives) {
  auto result = crosapi::mojom::DeviceIdLists::New();
  if (input_devices) {
    result->inputs = *input_devices;
  }
  if (output_devives) {
    result->outputs = *output_devives;
  }
  return result;
}

}  // namespace extensions
