/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.facebook.react.flat;

/* package */ class NodeRegion {
  /* package */ static final NodeRegion[] EMPTY_ARRAY = new NodeRegion[0];
  /* package */ static final NodeRegion EMPTY = new NodeRegion(0, 0, 0, 0, -1, false);

  private final float mLeft;
  private final float mTop;
  private final float mRight;
  private final float mBottom;
  /* package */ final int mTag;
  /* package */ final boolean mIsVirtual;

  /* package */ NodeRegion(
      float left,
      float top,
      float right,
      float bottom,
      int tag,
      boolean isVirtual) {
    mLeft = left;
    mTop = top;
    mRight = right;
    mBottom = bottom;
    mTag = tag;
    mIsVirtual = isVirtual;
  }

  /* package */ final boolean matches(
      float left,
      float top,
      float right,
      float bottom,
      boolean isVirtual) {
    return left == mLeft && top == mTop && right == mRight && bottom == mBottom &&
        isVirtual == mIsVirtual;
  }

  /**
   * The left bound of the underlying node.
   *
   * @return The node bound.
   */
  /* package */ final float getLeft() {
    return mLeft;
  }

  /**
   * The top bound of the underlying node.
   *
   * @return The node bound.
   */
  /* package */ final float getTop() {
    return mTop;
  }

  /**
   * The right bound of the underlying node.
   *
   * @return The node bound.
   */
  /* package */ final float getRight() {
    return mRight;
  }

  /**
   * The bottom bound of the underlying node.
   *
   * @return The node bound.
   */
  /* package */ final float getBottom() {
    return mBottom;
  }

  /**
   * The left bound of the region for the purpose of touch.  This is usually the bound of the
   * underlying node, except in the case of hit slop.
   *
   * @return The touch bound.
   */
  /* package */ float getTouchableLeft() {
    return getLeft();
  }

  /**
   * The top bound of the region for the purpose of touch.  This is usually the bound of the
   * underlying node, except in the case of hit slop.
   *
   * @return The touch bound.
   */
  /* package */ float getTouchableTop() {
    return getTop();
  }

  /**
   * The right bound of the region for the purpose of touch.  This is usually the bound of the
   * underlying node, except in the case of hit slop.
   *
   * @return The touch bound.
   */
  /* package */ float getTouchableRight() {
    return getRight();
  }

  /**
   * The bottom bound of the region for the purpose of touch.  This is usually the bound of the
   * underlying node, except in the case of hit slop.
   *
   * @return The touch bound.
   */
  /* package */ float getTouchableBottom() {
    return getBottom();
  }

  /* package */ boolean withinBounds(float touchX, float touchY) {
    return mLeft <= touchX && touchX < mRight && mTop <= touchY && touchY < mBottom;
  }

  /* package */ int getReactTag(float touchX, float touchY) {
    return mTag;
  }

  /* package */ boolean matchesTag(int tag) {
    return mTag == tag;
  }
}
