// Copyright 2017 Google Inc. 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/media.h"

#include "starboard/log.h"
#include "starboard/shared/uwp/application_uwp.h"
#include "starboard/time.h"

using starboard::shared::uwp::ApplicationUwp;

bool SbMediaSetOutputProtection(bool should_enable_dhcp) {
  bool is_hdcp_on = SbMediaIsOutputProtected();

  if (is_hdcp_on == should_enable_dhcp) {
    return true;
  }

  SB_LOG(INFO) << "Attempting to "
               << (should_enable_dhcp ? "enable" : "disable")
               << " output protection.  Current status: "
               << (is_hdcp_on ? "enabled" : "disabled");
  SbTimeMonotonic tick = SbTimeGetMonotonicNow();

  bool hdcp_success = false;
  if (should_enable_dhcp) {
    hdcp_success = ApplicationUwp::Get()->TurnOnHdcp();
  } else {
    hdcp_success = ApplicationUwp::Get()->TurnOffHdcp();
  }

  is_hdcp_on = (hdcp_success ? should_enable_dhcp : !should_enable_dhcp);

  SbTimeMonotonic tock = SbTimeGetMonotonicNow();
  SB_LOG(INFO) << "Output protection is "
    << (is_hdcp_on ? "enabled" : "disabled") << ".  Toggling HDCP took "
    << (tock - tick) / kSbTimeMillisecond << " milliseconds.";
  return hdcp_success;
}
