package com.ufund.api.ufundapi.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Arrays;

public class Need {

    public enum GoalType {
        MONETARY,
        PHYSICAL
    }

    @JsonProperty("name") private String name;
    @JsonProperty("image") private String image;
    @JsonProperty("location") private String location;
    @JsonProperty("id") private int id;
    @JsonProperty("filterAttributes") private String[] filterAttributes;
    @JsonProperty("type") final private GoalType type;
    @JsonProperty("maxGoal") private double maxGoal;
    @JsonProperty("urgent") private boolean urgent;
    @JsonProperty("current") private double current;
    @JsonProperty("description") private String description;

    /**
     * Create a new need, used by the controller
     *
     * @param name The name of the need
     * @param location The physical location of the need
     * @param id The unique ID of the need
     * @param maxGoal The maximum goal for this need
     * @param type The type of need (monetary, physical)
     * @param urgent The urgency of the need
     * @param description The description of the need
     */
    public Need(@JsonProperty("name") String name, @JsonProperty("image") String image, @JsonProperty("location") String location, @JsonProperty("id") int id, @JsonProperty("maxGoal") double maxGoal, @JsonProperty("type") GoalType type, @JsonProperty("urgent") boolean urgent, @JsonProperty("Description") String description) {
        this.id = id;
        this.image = image;
        this.location = location;
        this.name = name;
        this.maxGoal = maxGoal;
        this.type = type;
        this.urgent = urgent;
        this.description = description;
    }

    /**
     * Create a new need
     *
     * @param name    The name of the need
     * @param image   The image representation of the need
     * @param location The location of the need
     * @param maxGoal The maximum goal for this need
     * @param type    The type of need (monetary, physical)
     * @param urgent The urgency of the need
     * @param description The description of the need
     */
    public Need(String name, String image, String location, double maxGoal, GoalType type, boolean urgent, String description) {
        this.name = name;
        this.image = image;
        this.location = location;
        this.type = type;
        this.maxGoal = maxGoal;
        this.urgent = urgent;
        this.description = description;
    }

    /**
     * Create a deep copy of another need
     *
     * @param other The need to copy from
     */
    public Need(Need other) {
        this.name = other.name;
        this.image = other.image;
        this.location = other.location;
        this.id = other.id;
        this.filterAttributes = other.filterAttributes;
        this.type = other.type;
        this.maxGoal = other.maxGoal;
        this.current = other.current;
        this.urgent = other.urgent;
        this.description = other.description;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public String[] getFilterAttributes() {
        return filterAttributes;
    }

    public GoalType getType() {
        return type;
    }

    public double getMaxGoal() {
        return maxGoal;
    }

    public double getCurrent() {
        return current;
    }


    public void setCurrent(double current) {
        this.current = current;
    }

    public void incrementCurrent(double incrementAmount) {
        this.current += incrementAmount;
    }

    public void setFilterAttributes(String[] filterAttributes) {
        this.filterAttributes = filterAttributes;
    }

    public void setMaxGoal(double maxGoal) {
        this.maxGoal = maxGoal;
    }

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

    public void setID(int id){
        this.id = id;
    }

    @Override
    public String toString() {
        return "Need{" +
                "name='" + name + '\'' +
                ", image='" + image + '\'' +
                ", location='" + location + '\'' +
                ", id=" + id +
                ", filterAttributes=" + Arrays.toString(filterAttributes) +
                ", type=" + type +
                ", maxGoal=" + maxGoal +
                ", urgent=" + urgent +
                ", current=" + current +
                ", description='" + description + '\'' +
                '}';
    }
}