/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Copyright @ 2015 Atlassian Pty Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.java.sip.communicator.service.protocol;

import java.util.Objects;

/**
 * A point representing a location in {@code (x,y)} coordinate space,
 * specified in integer precision.
 * <p>
 * This class has been inspired by the java.awt.Point class.
 * <p>
 * @author Julien Waechter
 * @author Emil Ivov
 */
public class WhiteboardPoint implements Cloneable
{
    /**
     * The X coordinate of this WhiteboadPoint.
     */
    private double x;

    /**
     * The Y coordinate of this <code>Point</code>.
     */
    private double y;

    /**
     * Constructs and initializes a point with the same location as
     * the specified <tt>Point</tt> object.
     * @param p a point
     */
    public WhiteboardPoint(WhiteboardPoint p)
    {
        this(p.x, p.y);
    }

    /**
     * Constructs and initializes a point at the specified <tt>(x,y)</tt>
     * location in the coordinate space.
     *
     * @param x the X coordinate of the newly constructed <code>Point</code>
     * @param y the Y coordinate of the newly constructed <code>Point</code>
     * @since 1.0
     */
    public WhiteboardPoint(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    /**
     * Returns the X coordinate of this <tt>WhiteboardPoint</tt>.
     *
     * @return the x coordinate of this <tt>WhiteboardPoint</tt>.
     */
    public double getX()
    {
        return x;
    }

    /**
     * Returns the Y coordinate of this <tt>WhiteboardPoint</tt>.
     *
     * @return the y coordinate of this <tt>WhiteboardPoint</tt>.
     */
    public double getY()
    {
        return y;
    }

    /**
     * Sets a new value to the x coordinate.
     *
     * @param x the new value of the x coordinate
     */
    public void setX(double x)
    {
        this.x = x;
    }

    /**
     * Sets a new value to the y coordinate.
     *
     * @param y the new value of the y coordinate
     */
    public void setY(double y)
    {
        this.y = y;
    }

    /**
     * Determines whether or not two points are equal. Two instances of
     * <tt>WhiteboardPoint</tt> are equal if the values of their
     * <tt>x</tt> and <tt>y</tt> member fields, representing
     * their position in the coordinate space, are the same.
     *
     * @param obj an object to be compared with this <tt>WhiteboardPoint</tt>
     *
     * @return <tt>true</tt> if the object to be compared is an instance of
     * <tt>WhiteboardPoint</tt> and has the same values; <tt>false</tt>
     * otherwise.
     */
    @Override
    public boolean equals(Object obj)
    {
        if (obj instanceof WhiteboardPoint)
        {
            WhiteboardPoint pt = (WhiteboardPoint)obj;
            return (x == pt.x) && (y == pt.y);
        }

        return false;
    }

    @Override
    public int hashCode()
    {
        return Objects.hash(x, y);
    }

    /**
     * Returns a string representation of this point and its location
     * in the {@code (x,y)} coordinate space. This method is intended to be
     * used only for debugging purposes, and the content  and format of the
     * returned string may vary between implementations.
     *
     * The returned string may be empty but may not be <code>null</code>.
     *
     * @return a string representation of this point
     */
    @Override
    public String toString()
    {
        return getClass().getName() + "[x=" + x + ",y=" + y + "]";
    }

    /**
     * Creates and returns a copy of this <tt>WhiteboardPoint</tt>.
     *
     * @return     a clone of this <tt>WhiteboardPoint</tt> instance.
     */
    @Override
    protected Object clone()
    {
        return new WhiteboardPoint(this);
    }

    /**
     * Calculates the distance from this point the given point.
     *
     * @param p the point to which to calculate the distance
     * @return the distance between this point and the given point
     */
    public double distance(WhiteboardPoint p)
    {
        double PX = p.getX() - this.getX();
        double PY = p.getY() - this.getY();

        return Math.sqrt(PX * PX + PY * PY);
    }
}
