/**
 * This class is responsible for storing point in 2D.
 */
export class point {
    #x;
    #y;
    
    /**
     * This create new point, can be setup by new position.
     * 
     * @param {number} x - X position
     * @param {number} y - Y position
     */
    constructor(x = 0, y = 0) {
        this.#x = x;
        this.#y = y;
    }

    /**
     * @returns {number} - X value of point
     */
    get x() {
        return this.#x;
    }

    /**
     * @returns {number} - Y value of point
     */
    get y() {
        return this.#y;
    }

    /**
     * @param {number} target - New X value
     */
    set x(target) {
        this.#x = target;
    }  
    
    /**
     * @param {number} target - New Y value
     */
    set y(target) {
        this.#y = target;
    }

    /**
     * This compare two points, and return compare result. 
     * 
     * @example (point(5, 4).compare(point(10, 10)) => point(5, 6))
     * @param {point} target - Point to calculate 
     * @returns {point} - Compare result
     */
    compare(target) {
        return new point(
            target.x - this.x,
            target.y - this.y
        );
    }

    /**
     * This calculate distance between two points.
     * 
     * @param {point} target - Second point to calculate distance between
     * @returns {number} - Distance between this point and given point
     */
    distance(target) {
        const compared = this.compare(target);
        const summary = Math.pow(compared.x, 2) + Math.pow(compared.y, 2);
        const result = Math.sqrt(summary);

        return result;
    }
}