package net.filebot.similarity;

import static java.util.Arrays.*;
import static java.util.stream.Collectors.*;

public class MetricCascade implements SimilarityMetric {

	private final SimilarityMetric[] cascade;

	public MetricCascade(SimilarityMetric... cascade) {
		this.cascade = cascade;
	}

	@Override
	public float getSimilarity(Object o1, Object o2) {
		float f = 0;
		for (SimilarityMetric metric : cascade) {
			float similarity = metric.getSimilarity(o1, o2);
			if (Math.abs(similarity) >= Math.abs(f)) {
				// perfect match, ignore remaining metrics
				if (similarity >= 1) {
					return similarity;
				}

				// possible match or perfect negative match
				f = similarity;
			}
		}
		return f;
	}

	@Override
	public String toString() {
		return stream(cascade).map(Object::toString).collect(joining(", ", "MetricCascade(", ")"));
	}

}
