// Copyright 2018 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 "chromecast/browser/cast_gesture_dispatcher.h"

#include "chromecast/base/chromecast_switches.h"

namespace chromecast {
namespace shell {

namespace {
constexpr int kDefaultBackGestureHorizontalThreshold = 80;
}  // namespace

CastGestureDispatcher::CastGestureDispatcher(
    CastContentWindow::Delegate* delegate)
    : horizontal_threshold_(
          GetSwitchValueInt(switches::kBackGestureHorizontalThreshold,
                            kDefaultBackGestureHorizontalThreshold)),
      delegate_(delegate),
      dispatched_back_(false) {
  DCHECK(delegate_);
}
bool CastGestureDispatcher::CanHandleSwipe(CastSideSwipeOrigin swipe_origin) {
  return swipe_origin == CastSideSwipeOrigin::LEFT &&
         delegate_->CanHandleGesture(GestureType::GO_BACK);
}

void CastGestureDispatcher::HandleSideSwipeBegin(
    CastSideSwipeOrigin swipe_origin,
    const gfx::Point& touch_location) {
  if (swipe_origin == CastSideSwipeOrigin::LEFT) {
    dispatched_back_ = false;
    VLOG(1) << "swipe gesture begin";
    current_swipe_time_ = base::ElapsedTimer();
  }
}

void CastGestureDispatcher::HandleSideSwipeContinue(
    CastSideSwipeOrigin swipe_origin,
    const gfx::Point& touch_location) {
  if (swipe_origin != CastSideSwipeOrigin::LEFT) {
    return;
  }

  if (!delegate_->CanHandleGesture(GestureType::GO_BACK)) {
    return;
  }

  // Already dispatched, don't send further progress events.
  if (dispatched_back_) {
    return;
  }

  delegate_->GestureProgress(GestureType::GO_BACK, touch_location);
  VLOG(1) << "swipe gesture continue, elapsed time: "
          << current_swipe_time_.Elapsed().InMilliseconds() << "ms";
}

void CastGestureDispatcher::HandleSideSwipeEnd(
    CastSideSwipeOrigin swipe_origin,
    const gfx::Point& touch_location) {
  if (swipe_origin != CastSideSwipeOrigin::LEFT) {
    return;
  }
  VLOG(1) << "swipe end, elapsed time: "
          << current_swipe_time_.Elapsed().InMilliseconds() << "ms";
  if (!delegate_->CanHandleGesture(GestureType::GO_BACK)) {
    return;
  }

  // Already dispatched, don't send further events until the next begin.
  if (dispatched_back_) {
    return;
  }

  // Finger lifted before horizontal threshold met, cancel the gesture.
  if (touch_location.x() < horizontal_threshold_) {
    VLOG(1) << "swipe gesture cancelled";
    delegate_->CancelGesture(GestureType::GO_BACK, touch_location);
    return;
  }

  // Finger lifted after horizontal threshold, let the consumer know we have a
  // back gesture.
  dispatched_back_ = true;
  delegate_->ConsumeGesture(GestureType::GO_BACK);
  VLOG(1) << "swipe gesture complete, elapsed time: "
          << current_swipe_time_.Elapsed().InMilliseconds() << "ms";
}

void CastGestureDispatcher::HandleTapDownGesture(
    const gfx::Point& touch_location) {
  if (!delegate_->CanHandleGesture(GestureType::TAP_DOWN)) {
    return;
  }
  delegate_->ConsumeGesture(GestureType::TAP_DOWN);
}

void CastGestureDispatcher::HandleTapGesture(const gfx::Point& touch_location) {
  if (!delegate_->CanHandleGesture(GestureType::TAP)) {
    return;
  }
  delegate_->ConsumeGesture(GestureType::TAP);
}

}  // namespace shell
}  // namespace chromecast
