using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class FactComparer : EqualityComparer<Fact>
{
    protected bool search_righthanded;

    protected abstract bool Compare (Fact solution, Fact fact);

    public FactComparer SetSearchRight()
    {
        search_righthanded = true;
        return this;
    }
    public FactComparer SetSearchLeft()
    {
        search_righthanded = false;
        return this;
    }

    public override bool Equals(Fact left, Fact right)
    {
        return search_righthanded ? Compare(left, right) : Compare(right, left);
    }

    public override int GetHashCode(Fact obj)
    {
        return obj.GetType().GetHashCode();
    }
}

public class FactEquivalentsComparer : FactComparer
{
    protected override bool Compare (Fact solution, Fact fact)
    {
        return solution.Equivalent(fact);
    }
}

class LineFactHightDirectionComparer : FactComparer
{
    protected override bool Compare (Fact solution, Fact fact)
    {
        return fact is LineFact && solution is LineFact
            && Math3d.IsApproximatelyParallel(((LineFact) fact).Dir, ((LineFact) solution).Dir)
            && ((LineFact) fact).Distance + Math3d.vectorPrecission >= ((LineFact) solution).Distance;
        // && Mathf.Approximately(((LineFact) x).Distance, ((LineFact) y).Distance);
    }
}