package worms.util;

import be.kuleuven.cs.som.annotate.Immutable;
import be.kuleuven.cs.som.annotate.Value;

import java.util.Objects;


/**
 * A tuple (pair) implementation
 *
 * @param <T1> first element type
 * @param <T2> second element type
 *
 *
 * @version 1.1
 * @author Arthur Bols & Leen Dereu
 */
@Value
public class Tuple<T1, T2> {


    public final T1 item1;
    public final T2 item2;


    /**
     *
     * @param item1
     *        The first element for this tuple
     * @param item2
     *        The second element for this tuple
     */
    public Tuple(T1 item1, T2 item2) throws IllegalArgumentException {

        /*if (item1 == null)
            throw new IllegalArgumentException("item1 may not be null");
        if (item2 == null)
            throw new IllegalArgumentException("item2 may not be null");*/

        this.item1 = item1;
        this.item2 = item2;
    }

    @Immutable
    public static <T1, T2> Tuple<T1, T2> create(T1 item1, T2 item2){
        return new Tuple<>(item1, item2);
    }

    @Immutable
    public static Tuple<Double, Double> create(double[] arr) throws IllegalArgumentException {
        if (arr == null || arr.length != 2)
            throw new IllegalArgumentException("Invalid parameter arr");
        return new Tuple<>(arr[0], arr[1]);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Tuple)) return false;
        Tuple<?, ?> tuple = (Tuple<?, ?>) o;
        return Objects.equals(item1, tuple.item1) &&
                Objects.equals(item2, tuple.item2);
    }

    @Override
    public int hashCode() {

        return Objects.hash(item1, item2);
    }
}
