// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// 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.

#include "starboard/shared/media_session/playback_state.h"

#include "cobalt/extension/media_session.h"
#include "starboard/common/log.h"
#include "starboard/string.h"
#include "starboard/system.h"

namespace starboard {
namespace shared {
namespace media_session {
namespace {

CobaltExtensionMediaSessionPlaybackState
PlaybackStateToMediaSessionPlaybackState(PlaybackState state) {
  CobaltExtensionMediaSessionPlaybackState result;
  switch (state) {
    case kPlaying:
      result = kCobaltExtensionMediaSessionPlaying;
      break;
    case kPaused:
      result = kCobaltExtensionMediaSessionPaused;
      break;
    case kNone:
      result = kCobaltExtensionMediaSessionNone;
      break;
    default:
      SB_NOTREACHED() << "Unsupported PlaybackState " << state;
      result = static_cast<CobaltExtensionMediaSessionPlaybackState>(-1);
  }
  return result;
}

const CobaltExtensionMediaSessionApi* g_extension;
}  // namespace

void UpdateActiveSessionPlatformPlaybackState(PlaybackState state) {
#if SB_API_VERSION >= 11
  if (g_extension == NULL) {
    g_extension = static_cast<const CobaltExtensionMediaSessionApi*>(
        SbSystemGetExtension(kCobaltExtensionMediaSessionName));
  }
#endif
  if (g_extension &&
      SbStringCompareAll(g_extension->name, kCobaltExtensionMediaSessionName) ==
          0 &&
      g_extension->version >= 1) {
    CobaltExtensionMediaSessionPlaybackState ext_state =
        PlaybackStateToMediaSessionPlaybackState(state);
    g_extension->UpdateActiveSessionPlatformPlaybackState(ext_state);
  }
}
}  // namespace media_session
}  // namespace shared
}  // namespace starboard
