// Copyright 2016 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 "ash/mus/accelerators/accelerator_controller_delegate_mus.h"

#include "ash/mus/window_manager.h"
#include "base/logging.h"
#include "mash/public/interfaces/launchable.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
#include "services/ui/public/interfaces/constants.mojom.h"
#include "services/ui/public/interfaces/display/display_controller.mojom.h"
#include "services/ui/public/interfaces/display/test_display_controller.mojom.h"
#include "ui/display/screen.h"

namespace ash {
namespace mus {

AcceleratorControllerDelegateMus::AcceleratorControllerDelegateMus(
    WindowManager* window_manager)
    : window_manager_(window_manager) {}

AcceleratorControllerDelegateMus::~AcceleratorControllerDelegateMus() {}

bool AcceleratorControllerDelegateMus::HandlesAction(AcceleratorAction action) {
  // Accelerators that return true need to work differently in mash. These
  // should have implementations in CanPerformAction() and PerformAction().
  // Accelerators that return false have not been ported to work with mash yet.
  // If the behavior between cash and mash can be unified then the accelerator
  // should be moved to accelerator_controller.cc/h. See
  // http://crbug.com/612331.
  switch (action) {
    case DEV_ADD_REMOVE_DISPLAY:
    case DEV_TOGGLE_UNIFIED_DESKTOP:
    case ROTATE_SCREEN:
    case SCALE_UI_DOWN:
    case SCALE_UI_RESET:
    case SCALE_UI_UP:
    case SWAP_PRIMARY_DISPLAY:
    case TOGGLE_MIRROR_MODE:
    case TOUCH_HUD_PROJECTION_TOGGLE:
      return true;
    case DEBUG_TOGGLE_DEVICE_SCALE_FACTOR:
    case DEBUG_TOGGLE_SHOW_DEBUG_BORDERS:
    case DEBUG_TOGGLE_SHOW_FPS_COUNTER:
    case DEBUG_TOGGLE_SHOW_PAINT_RECTS:
    case DEV_TOGGLE_ROOT_WINDOW_FULL_SCREEN:
    case LOCK_PRESSED:
    case LOCK_RELEASED:
    case MAGNIFY_SCREEN_ZOOM_IN:
    case MAGNIFY_SCREEN_ZOOM_OUT:
    case POWER_PRESSED:
    case POWER_RELEASED:
    case ROTATE_WINDOW:
    case SHOW_SYSTEM_TRAY_BUBBLE:
    case TAKE_PARTIAL_SCREENSHOT:
    case TAKE_SCREENSHOT:
    case TAKE_WINDOW_SCREENSHOT:
    case TOUCH_HUD_CLEAR:
    case TOUCH_HUD_MODE_CHANGE:
    case UNPIN:
      NOTIMPLEMENTED();
      return false;
    default:
      break;
  }
  return false;
}

bool AcceleratorControllerDelegateMus::CanPerformAction(
    AcceleratorAction action,
    const ui::Accelerator& accelerator,
    const ui::Accelerator& previous_accelerator) {
  switch (action) {
    case DEV_ADD_REMOVE_DISPLAY:
    case DEV_TOGGLE_UNIFIED_DESKTOP:
    case ROTATE_SCREEN:
    case SCALE_UI_DOWN:
    case SCALE_UI_RESET:
    case SCALE_UI_UP:
      return true;
    case SWAP_PRIMARY_DISPLAY:
      return display::Screen::GetScreen()->GetNumDisplays() > 1;
    case TOGGLE_MIRROR_MODE:
    case TOUCH_HUD_PROJECTION_TOGGLE:
      return true;
    default:
      break;
  }
  return false;
}

void AcceleratorControllerDelegateMus::PerformAction(
    AcceleratorAction action,
    const ui::Accelerator& accelerator) {
  switch (action) {
    case DEV_ADD_REMOVE_DISPLAY: {
      display::mojom::TestDisplayControllerPtr test_display_controller;
      window_manager_->connector()->BindInterface(ui::mojom::kServiceName,
                                                  &test_display_controller);
      test_display_controller->ToggleAddRemoveDisplay();
      break;
    }
    case DEV_TOGGLE_UNIFIED_DESKTOP: {
      // TODO(crbug.com/657816): This is hack. I'm just stealing the shortcut
      // key to toggle display size in mus. This should be removed by launch.
      display::mojom::TestDisplayControllerPtr test_display_controller;
      window_manager_->connector()->BindInterface(ui::mojom::kServiceName,
                                                  &test_display_controller);
      test_display_controller->ToggleDisplayResolution();
      break;
    }
    case ROTATE_SCREEN: {
      window_manager_->GetDisplayController()->RotateCurrentDisplayCW();
      break;
    }
    case SCALE_UI_DOWN: {
      window_manager_->GetDisplayController()->DecreaseInternalDisplayZoom();
      break;
    }
    case SCALE_UI_RESET: {
      window_manager_->GetDisplayController()->ResetInternalDisplayZoom();
      break;
    }
    case SCALE_UI_UP: {
      window_manager_->GetDisplayController()->IncreaseInternalDisplayZoom();
      break;
    }
    case SWAP_PRIMARY_DISPLAY: {
      window_manager_->GetDisplayController()->SwapPrimaryDisplay();
      break;
    }
    case TOGGLE_MIRROR_MODE: {
      window_manager_->GetDisplayController()->ToggleMirrorMode();
      break;
    }
    case TOUCH_HUD_PROJECTION_TOGGLE: {
      mash::mojom::LaunchablePtr launchable;
      window_manager_->connector()->BindInterface("touch_hud", &launchable);
      launchable->Launch(mash::mojom::kWindow,
                         mash::mojom::LaunchMode::DEFAULT);
      break;
    }
    default:
      NOTREACHED();
  }
}

void AcceleratorControllerDelegateMus::ShowDeprecatedAcceleratorNotification(
    const char* const notification_id,
    int message_id,
    int old_shortcut_id,
    int new_shortcut_id) {
  // TODO: http://crbug.com/630316.
  NOTIMPLEMENTED();
}

}  // namespace mus
}  // namespace ash
