package seng302.Model;

import org.geotools.referencing.GeodeticCalculator;

import java.util.ArrayList;


/**
 * Created by esa46 on 1/05/17.
 */
public class Boat {
    private String name;
    private double velocity;
    private double scaledVelocity;
    private String abbrev;
    private int sourceID;
    private Leg currentLeg;
    private double distanceTravelledInLeg;
    private GPSCoordinate currentPosition;
    private long timeFinished = -1;
    private boolean started = false;
    private double heading;
    private Polars polars;

    /**
     * Boat initialiser which keeps all of the information of the boat.
     *
     * @param name     Name of the Boat.
     * @param velocity Speed in m/s that the boat travels at.
     * @param abbrev   nam abbreviation
     * @param sourceID id of boat
     * @param polars The polars table to use for this boat.
     */
    public Boat(String name, double velocity, String abbrev, int sourceID, Polars polars) {
        this.velocity = velocity;
        this.abbrev = abbrev;
        this.name = name;
        this.sourceID = sourceID;
        this.polars = polars;
    }

    /**
     * Calculates the azimuth of the travel via map coordinates of the raceMarkers
     *
     * @return the direction that the boat is heading towards in degrees (-180 to 180).
     */
    public double calculateAzimuth() {

        GeodeticCalculator calc = new GeodeticCalculator();
        GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate();
        GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate();

        calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude());
        calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude());

        return calc.getAzimuth();
    }

    /**
     * Calculate the heding depending on the calculated azimuth value
     * @return The azimuth value which is greater than 0
     */
    public double calculateHeading() {
        double azimuth = this.calculateAzimuth();

        if (azimuth >= 0) {
            return azimuth;
        } else {
            return azimuth + 360;
        }
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getVelocity() {
        return velocity;
    }

    public void setVelocity(double velocity) {
        this.velocity = velocity;
    }

    public double getScaledVelocity() {
        return scaledVelocity;
    }

    public void setScaledVelocity(double scaledVelocity) {
        this.scaledVelocity = scaledVelocity;
    }

    public String getAbbrev() {
        return abbrev;
    }

    public void setAbbrev(String abbrev) {
        this.abbrev = abbrev;
    }

    public int getSourceID() {
        return sourceID;
    }

    public void setSourceID(int sourceID) {
        this.sourceID = sourceID;
    }

    public Leg getCurrentLeg() {
        return currentLeg;
    }

    public void setCurrentLeg(Leg currentLeg) {
        this.currentLeg = currentLeg;
    }

    public double getDistanceTravelledInLeg() {
        return distanceTravelledInLeg;
    }

    public void setDistanceTravelledInLeg(double distanceTravelledInLeg) {
        this.distanceTravelledInLeg = distanceTravelledInLeg;
    }

    public GPSCoordinate getCurrentPosition() {
        return currentPosition;
    }

    public void setCurrentPosition(GPSCoordinate currentPosition) {
        this.currentPosition = currentPosition;
    }

    public long getTimeFinished() {
        return timeFinished;
    }

    public void setTimeFinished(long timeFinished) {
        this.timeFinished = timeFinished;
    }

    public boolean isStarted() {
        return started;
    }

    public void setStarted(boolean started) {
        this.started = started;
    }

    public double getHeading() {
        return heading;
    }

    public void setHeading(double heading) {
        this.heading = heading;
    }


    public Polars getPolars() {
        return polars;
    }

    public void setPolars(Polars polars) {
        this.polars = polars;
    }
}
