// Copyright (c) 2012 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.

#ifndef COBALT_MATH_RECT_BASE_IMPL_H_
#define COBALT_MATH_RECT_BASE_IMPL_H_

#include <algorithm>
#include <limits>

#include "base/logging.h"
#include "base/stringprintf.h"
#include "cobalt/math/rect_base.h"

namespace cobalt {
namespace math {

template <typename Type>
void AdjustAlongAxis(Type dst_origin, Type dst_size, Type* origin, Type* size) {
  *size = std::min(dst_size, *size);
  if (*origin < dst_origin)
    *origin = dst_origin;
  else
    *origin = std::min(dst_origin + dst_size, *origin + *size) - *size;
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::SetRect(Type x, Type y, Type width, Type height) {
  origin_.SetPoint(x, y);
  set_width(width);
  set_height(height);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Inset(const InsetsClass& insets) {
  Inset(insets.left(), insets.top(), insets.right(), insets.bottom());
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Inset(Type left, Type top, Type right, Type bottom) {
  origin_ += VectorClass(left, top);
  set_width(std::max(width() - left - right, static_cast<Type>(0)));
  set_height(std::max(height() - top - bottom, static_cast<Type>(0)));
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Offset(Type horizontal, Type vertical) {
  origin_ += VectorClass(horizontal, vertical);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
operator+=(const VectorClass& offset) {
  origin_ += offset;
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
operator-=(const VectorClass& offset) {
  origin_ -= offset;
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>::
operator<(const Class& other) const {
  if (origin_ == other.origin_) {
    if (width() == other.width()) {
      return height() < other.height();
    } else {
      return width() < other.width();
    }
  } else {
    return origin_ < other.origin_;
  }
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Contains(Type point_x, Type point_y) const {
  return (point_x >= x()) && (point_x < right()) && (point_y >= y()) &&
         (point_y < bottom());
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Contains(const Class& rect) const {
  return (rect.x() >= x() && rect.right() <= right() && rect.y() >= y() &&
          rect.bottom() <= bottom());
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Intersects(const Class& rect) const {
  return !(IsEmpty() || rect.IsEmpty() || rect.x() >= right() ||
           rect.right() <= x() || rect.y() >= bottom() || rect.bottom() <= y());
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Intersect(const Class& rect) {
  if (IsEmpty() || rect.IsEmpty()) {
    SetRect(Type(0), Type(0), Type(0), Type(0));
    return;
  }

  Type rx = std::max(x(), rect.x());
  Type ry = std::max(y(), rect.y());
  Type rr = std::min(right(), rect.right());
  Type rb = std::min(bottom(), rect.bottom());

  if (rx >= rr || ry >= rb) rx = ry = rr = rb = Type(0);  // non-intersecting

  SetRect(rx, ry, rr - rx, rb - ry);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Union(const Class& rect) {
  if (IsEmpty()) {
    *this = rect;
    return;
  }
  if (rect.IsEmpty()) return;

  Type rx = std::min(x(), rect.x());
  Type ry = std::min(y(), rect.y());
  Type rr = std::max(right(), rect.right());
  Type rb = std::max(bottom(), rect.bottom());

  SetRect(rx, ry, rr - rx, rb - ry);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::Subtract(const Class& rect) {
  if (!Intersects(rect)) return;
  if (rect.Contains(*static_cast<const Class*>(this))) {
    SetRect(Type(0), Type(0), Type(0), Type(0));
    return;
  }

  Type rx = x();
  Type ry = y();
  Type rr = right();
  Type rb = bottom();

  if (rect.y() <= y() && rect.bottom() >= bottom()) {
    // complete intersection in the y-direction
    if (rect.x() <= x()) {
      rx = rect.right();
    } else if (rect.right() >= right()) {
      rr = rect.x();
    }
  } else if (rect.x() <= x() && rect.right() >= right()) {
    // complete intersection in the x-direction
    if (rect.y() <= y()) {
      ry = rect.bottom();
    } else if (rect.bottom() >= bottom()) {
      rb = rect.y();
    }
  }
  SetRect(rx, ry, rr - rx, rb - ry);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::AdjustToFit(const Class& rect) {
  Type new_x = x();
  Type new_y = y();
  Type new_width = width();
  Type new_height = height();
  AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width);
  AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height);
  SetRect(new_x, new_y, new_width, new_height);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
PointClass RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
                    Type>::CenterPoint() const {
  return PointClass(x() + width() / 2, y() + height() / 2);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::ClampToCenteredSize(const SizeClass& size) {
  Type new_width = std::min(width(), size.width());
  Type new_height = std::min(height(), size.height());
  Type new_x = x() + (width() - new_width) / 2;
  Type new_y = y() + (height() - new_height) / 2;
  SetRect(new_x, new_y, new_width, new_height);
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::SplitVertically(Class* left_half,
                                     Class* right_half) const {
  DCHECK(left_half);
  DCHECK(right_half);

  left_half->SetRect(x(), y(), width() / 2, height());
  right_half->SetRect(left_half->right(), y(), width() - left_half->width(),
                      height());
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::SharesEdgeWith(const Class& rect) const {
  return (y() == rect.y() && height() == rect.height() &&
          (x() == rect.right() || right() == rect.x())) ||
         (x() == rect.x() && width() == rect.width() &&
          (y() == rect.bottom() || bottom() == rect.y()));
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::ManhattanDistanceToPoint(const PointClass& point) const {
  Type x_distance =
      std::max<Type>(Type(0), std::max(x() - point.x(), point.x() - right()));
  Type y_distance =
      std::max<Type>(Type(0), std::max(y() - point.y(), point.y() - bottom()));

  return x_distance + y_distance;
}

template <typename Class, typename PointClass, typename SizeClass,
          typename InsetsClass, typename VectorClass, typename Type>
Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass,
              Type>::ManhattanInternalDistance(const Class& rect) const {
  Class c(x(), y(), width(), height());
  c.Union(rect);

  const Type kEpsilon = std::numeric_limits<Type>::is_integer
                                   ? Type(1)
                                   : std::numeric_limits<Type>::epsilon();

  Type x =
      std::max<Type>(Type(0), c.width() - width() - rect.width() + kEpsilon);
  Type y =
      std::max<Type>(Type(0), c.height() - height() - rect.height() + kEpsilon);
  return x + y;
}

}  // namespace math
}  // namespace cobalt

#endif  // COBALT_MATH_RECT_BASE_IMPL_H_
