package org.insa.algo;

import java.time.Duration;

public abstract class AbstractSolution {

    /**
     * Possible status for a solution.
     *
     */
    public enum Status {
        UNKNOWN, INFEASIBLE, FEASIBLE, OPTIMAL,
    };

    // Status of the solution.
    Status status;

    // Solving time for the solution.
    Duration solvingTime;

    // Original input of the solution.
    AbstractInputData data;

    /**
     * Create a new abstract solution with unknown status.
     * 
     * @param data
     */
    protected AbstractSolution(AbstractInputData data) {
        this.data = data;
        this.solvingTime = Duration.ZERO;
        this.status = Status.UNKNOWN;
    }

    protected AbstractSolution(AbstractInputData data, Status status) {
        this.data = data;
        this.status = status;
    }

    /**
     * @return Original input for this solution.
     */
    public AbstractInputData getInputData() {
        return data;
    }

    /**
     * @return Status of this solution.
     */
    public Status getStatus() {
        return status;
    }

    /**
     * @return Solving time of this solution.
     */
    public Duration getSolvingTime() {
        return solvingTime;
    }

    /**
     * Set the solving time of this solution.
     * 
     * @param solvingTime Solving time for the solution.
     */
    protected void setSolvingTime(Duration solvingTime) {
        this.solvingTime = solvingTime;
    }

    /**
     * @return true if the solution is feasible or optimal.
     */
    public boolean isFeasible() {
        return status == Status.FEASIBLE || status == Status.OPTIMAL;
    }

}
