/*
        This software is distributed under the "New BSD License" agreement:

        Copyright (c) 2016 Bogdan-Florin Gheran, Gabriel Cramariuc, Ionela Rusu, Elena-Gina Craciun. All rights reserved.

        Redistribution and use in source and binary forms, with or without modification, are permitted provided
        that the following conditions are met:
        - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
        - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or
        other materials provided with the distribution.
        - Neither the name of the University Stefan cel Mare of Suceava nor the names of its contributors may be used to endorse
        or promote products derived from this software without specific prior written permission.

        THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
        ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
        THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bogdan-Florin Gheran, Gabriel Cramariuc, Ionela Rusu, or Elena-Gina Craciun
        BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
        OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        SUCH DAMAGE.
 */
package com.example.circle.tapexperiment;
import android.graphics.Point;

//
// Implements a circular touch target.
//
class Target {

    public enum Zone {
        NONE,
        TOP, BOTTOM, LEFT, RIGHT,
        TOPLEFT, TOPRIGHT, BOTTOMLEFT, BOTTOMRIGHT,
        CENTER
    };

    public enum MovementDirection {
        NONE,
        LEFT, RIGHT, UP, DOWN
    };

    private int ID;                                 // uniquely identifies this target in a list of targets
    private Point center;                           // target center (x,y)
    private int radium;                             // radium of the target
    private Zone zoneOnScreen;                      // the specific area on the screen where this target is originally displayed
    private MovementDirection movementDirection;    // the direction in which this target moves, if any
    private int movementSpeed;                      // the speed at which this target moves, if any
    private int sizeSpeed;                          // the speed at which this target changes size, if any
    private int padding;                            // padding between targets

    //region [target constructors]

    public Target(int targetID, Point center, int radium) {
        this.ID = targetID;
        this.center = center;
        this.radium = radium;
        this.zoneOnScreen = Zone.NONE;
        this.movementDirection = MovementDirection.NONE;
        this.movementSpeed = 0;
        this.sizeSpeed = 0;
        this.padding = 0;
    }

    public Target(int targetID, Point center, int radium, Zone zoneOnScreen) {
        this(targetID, center, radium);
        this.zoneOnScreen = zoneOnScreen;
    }

    public Target(int targetID, Point center, int radium, int padding) {
        this(targetID, center, radium);
        this.padding = padding;
    }

    public Target(int targetID, Point center, int radium, Zone zoneOnScreen, MovementDirection movementDirection, int movementSpeed) {
        this(targetID, center, radium, zoneOnScreen);
        this.movementDirection = movementDirection;
        this.movementSpeed = movementSpeed;
    }

    public Target(int targetID, Point center, int radium, Zone zoneOnScreen, int sizeSpeed) {
        this(targetID, center, radium, zoneOnScreen);
        this.sizeSpeed = sizeSpeed;
    }

    //endregion

    //region [properties]

    public int getID() {
        return ID;
    }

    public Point getCenter() {
        return center;
    }

    public void setCenter(Point center) {
        this.center = center;
    }

    public int getRadium() {
        return radium;
    }

    public void setRadium(int radium){
        this.radium = radium;
    }

    public Zone getZoneOnScreen() {
        return zoneOnScreen;
    }

    public int getPadding() {return padding;}

    public MovementDirection getMovementDirection() {
        return movementDirection;
    }

    public void setMovementDirection(MovementDirection movementDirection){
        this.movementDirection = movementDirection;
    }

    public int getMovementSpeed() {
        return movementSpeed;
    }

    public int getSizeSpeed(){
        return sizeSpeed;
    }

    //endregion

    public boolean isTouchInside(int x, int y) {
        return Geometry.EuclideanDistance(center.x, center.y, x, y) <= radium ? true : false;
    }
}
