// Copyright 2014 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/events/gesture_detection/motion_event.h"

#include "base/logging.h"

namespace ui {

size_t MotionEvent::GetHistorySize() const {
  return 0;
}

base::TimeTicks MotionEvent::GetHistoricalEventTime(
    size_t historical_index) const {
  NOTIMPLEMENTED();
  return base::TimeTicks();
}

float MotionEvent::GetHistoricalTouchMajor(size_t pointer_index,
                                           size_t historical_index) const {
  NOTIMPLEMENTED();
  return 0.f;
}

float MotionEvent::GetHistoricalX(size_t pointer_index,
                                  size_t historical_index) const {
  NOTIMPLEMENTED();
  return 0.f;
}

float MotionEvent::GetHistoricalY(size_t pointer_index,
                                  size_t historical_index) const {
  NOTIMPLEMENTED();
  return 0.f;
}

int MotionEvent::FindPointerIndexOfId(int id) const {
  const size_t pointer_count = GetPointerCount();
  for (size_t i = 0; i < pointer_count; ++i) {
    if (GetPointerId(i) == id)
      return static_cast<int>(i);
  }
  return -1;
}

bool operator==(const MotionEvent& lhs, const MotionEvent& rhs) {
  if (lhs.GetId() != rhs.GetId() || lhs.GetAction() != rhs.GetAction() ||
      lhs.GetActionIndex() != rhs.GetActionIndex() ||
      lhs.GetPointerCount() != rhs.GetPointerCount() ||
      lhs.GetButtonState() != rhs.GetButtonState() ||
      lhs.GetEventTime() != rhs.GetEventTime() ||
      lhs.GetHistorySize() != rhs.GetHistorySize())
    return false;

  for (size_t i = 0; i < lhs.GetPointerCount(); ++i) {
    int rhsi = rhs.FindPointerIndexOfId(lhs.GetPointerId(i));
    if (rhsi == -1)
      return false;

    if (lhs.GetX(i) != rhs.GetX(rhsi) || lhs.GetY(i) != rhs.GetY(rhsi) ||
        lhs.GetRawX(i) != rhs.GetRawX(rhsi) ||
        lhs.GetRawY(i) != rhs.GetRawY(rhsi) ||
        lhs.GetTouchMajor(i) != rhs.GetTouchMajor(rhsi) ||
        lhs.GetTouchMinor(i) != rhs.GetTouchMinor(rhsi) ||
        lhs.GetOrientation(i) != rhs.GetOrientation(rhsi) ||
        lhs.GetPressure(i) != rhs.GetPressure(rhsi) ||
        lhs.GetToolType(i) != rhs.GetToolType(rhsi))
      return false;

    for (size_t h = 0; h < lhs.GetHistorySize(); ++h) {
      if (lhs.GetHistoricalX(i, h) != rhs.GetHistoricalX(rhsi, h) ||
          lhs.GetHistoricalY(i, h) != rhs.GetHistoricalY(rhsi, h) ||
          lhs.GetHistoricalTouchMajor(i, h) !=
              rhs.GetHistoricalTouchMajor(rhsi, h))
        return false;
    }
  }

  for (size_t h = 0; h < lhs.GetHistorySize(); ++h) {
    if (lhs.GetHistoricalEventTime(h) != rhs.GetHistoricalEventTime(h))
      return false;
  }

  return true;
}

bool operator!=(const MotionEvent& lhs, const MotionEvent& rhs) {
  return !(lhs == rhs);
}

}  // namespace ui