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

#include "ui/base/now_playing/remote_command_center_delegate_ns.h"

#import <MediaPlayer/MediaPlayer.h>

#include "ui/base/now_playing/remote_command_center_delegate_impl.h"

API_AVAILABLE(macos(10.12.2))
@interface RemoteCommandCenterDelegateNS ()

- (void)setCommand:(MPRemoteCommand*)command enabled:(bool)enabled;
- (void)enableCommand:(MPRemoteCommand*)command;
- (void)disableCommand:(MPRemoteCommand*)command;

@end

@implementation RemoteCommandCenterDelegateNS

- (instancetype)initWithDelegate:
    (now_playing::RemoteCommandCenterDelegateImpl*)delegate {
  if (self = [super init]) {
    delegate_ = delegate;

    // Initialize all commands as disabled.
    MPRemoteCommandCenter* commandCenter =
        [MPRemoteCommandCenter sharedCommandCenter];
    commandCenter.pauseCommand.enabled = NO;
    commandCenter.playCommand.enabled = NO;
    commandCenter.stopCommand.enabled = NO;
    commandCenter.togglePlayPauseCommand.enabled = NO;
    commandCenter.nextTrackCommand.enabled = NO;
    commandCenter.previousTrackCommand.enabled = NO;
    commandCenter.changeRepeatModeCommand.enabled = NO;
    commandCenter.changeShuffleModeCommand.enabled = NO;
    commandCenter.changePlaybackRateCommand.enabled = NO;
    commandCenter.seekBackwardCommand.enabled = NO;
    commandCenter.seekForwardCommand.enabled = NO;
    commandCenter.skipBackwardCommand.enabled = NO;
    commandCenter.skipForwardCommand.enabled = NO;
    commandCenter.changePlaybackPositionCommand.enabled = NO;
    commandCenter.ratingCommand.enabled = NO;
    commandCenter.likeCommand.enabled = NO;
    commandCenter.dislikeCommand.enabled = NO;
    commandCenter.bookmarkCommand.enabled = NO;
    commandCenter.enableLanguageOptionCommand.enabled = NO;
    commandCenter.disableLanguageOptionCommand.enabled = NO;
  }
  return self;
}

- (MPRemoteCommandHandlerStatus)onCommand:(MPRemoteCommandEvent*)event {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  if (event.command == commandCenter.pauseCommand) {
    delegate_->OnPause();
  } else if (event.command == commandCenter.playCommand) {
    delegate_->OnPlay();
  } else if (event.command == commandCenter.stopCommand) {
    delegate_->OnStop();
  } else if (event.command == commandCenter.togglePlayPauseCommand) {
    delegate_->OnPlayPause();
  } else if (event.command == commandCenter.nextTrackCommand) {
    delegate_->OnNext();
  } else if (event.command == commandCenter.previousTrackCommand) {
    delegate_->OnPrevious();
  }
  return MPRemoteCommandHandlerStatusSuccess;
}

- (void)setCanPlay:(bool)can_play {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.playCommand enabled:can_play];
}

- (void)setCanPause:(bool)can_pause {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.pauseCommand enabled:can_pause];
}

- (void)setCanStop:(bool)can_stop {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.stopCommand enabled:can_stop];
}

- (void)setCanPlayPause:(bool)can_playpause {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.togglePlayPauseCommand enabled:can_playpause];
}

- (void)setCanGoNextTrack:(bool)can_go_next_track {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.nextTrackCommand enabled:can_go_next_track];
}

- (void)setCanGoPreviousTrack:(bool)can_go_prev_track {
  MPRemoteCommandCenter* commandCenter =
      [MPRemoteCommandCenter sharedCommandCenter];
  [self setCommand:commandCenter.previousTrackCommand
           enabled:can_go_prev_track];
}

- (void)setCommand:(MPRemoteCommand*)command enabled:(bool)enabled {
  if (enabled) {
    [self enableCommand:command];
  } else {
    [self disableCommand:command];
  }
}

- (void)enableCommand:(MPRemoteCommand*)command {
  command.enabled = YES;
  [command addTarget:self action:@selector(onCommand:)];
}

- (void)disableCommand:(MPRemoteCommand*)command {
  command.enabled = NO;
  [command removeTarget:self];
}

@end
