// Copyright 2018 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.

#ifndef COBALT_MEDIA_SESSION_MEDIA_SESSION_ACTION_DETAILS_H_
#define COBALT_MEDIA_SESSION_MEDIA_SESSION_ACTION_DETAILS_H_

#include "base/logging.h"
#include "cobalt/media_session/media_session_action.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace media_session {

class MediaSessionActionDetails : public script::Wrappable {
 public:
  // Non-Wrappable class holding the data needed for selected actions. This can
  // be constructed on any thread, and then it's used internally to construct
  // MediaSessionActionDetails on the web module thread.
  class Data {
   public:
    explicit Data(MediaSessionAction action, double seek = 0.0)
        : action_(action),
          seek_time_(action == kMediaSessionActionSeek ? seek : 0.0),
          seek_offset_(
              (action == kMediaSessionActionSeekforward
                  || action == kMediaSessionActionSeekbackward) ? seek : 0.0) {
      DCHECK(seek >= 0.0);
      DCHECK(seek == 0.0
             || action == kMediaSessionActionSeek
             || action == kMediaSessionActionSeekforward
             || action == kMediaSessionActionSeekbackward);
    }
    Data(const Data&) = default;

    MediaSessionAction action() const { return action_; }

   private:
    friend class MediaSessionActionDetails;

    MediaSessionAction action_;
    double seek_time_;
    double seek_offset_;
  };

  explicit MediaSessionActionDetails(const Data& data) : data_(data) {}

  MediaSessionAction action() const { return data_.action_; }
  double seek_time() const { return data_.seek_time_; }
  double seek_offset() const { return data_.seek_offset_; }

  DEFINE_WRAPPABLE_TYPE(MediaSessionActionDetails);

 private:
  Data data_;
};

}  // namespace media_session
}  // namespace cobalt

#endif  // COBALT_MEDIA_SESSION_MEDIA_SESSION_ACTION_DETAILS_H_
