﻿using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Arugula
{
    public static class ComponentExtensions
    {
        public static T ClosestTo<T>(this List<T> components, Vector3 to, bool ignoreY = false) where T : Component
        {
            if (ignoreY)
                return components.OrderBy(x => Vector3.Distance(x.transform.position.GetFlattened(), to.GetFlattened())).FirstOrDefault();
            else
                return components.OrderBy(x => Vector3.Distance(x.transform.position, to)).FirstOrDefault();
        }

        public static T ClosestTo<T>(this List<T> components, Vector3 to, float maxDistance, bool ignoreY = false) where T : Component
        {
            if (ignoreY)
                return components.Where(x => Vector3.Distance(x.transform.position.GetFlattened(), to.GetFlattened()) <= maxDistance).OrderBy(x => Vector3.Distance(x.transform.position.GetFlattened(), to.GetFlattened())).FirstOrDefault();
            else
                return components.Where(x => Vector3.Distance(x.transform.position, to) <= maxDistance).OrderBy(x => Vector3.Distance(x.transform.position, to)).FirstOrDefault();
        }

        public static T FurthestFrom<T>(this List<T> components, Vector3 from, bool ignoreY = false) where T : Component
        {
            if (ignoreY)
                return components.OrderByDescending(x => Vector3.Distance(x.transform.position.GetFlattened(), from.GetFlattened())).FirstOrDefault();
            else
                return components.OrderByDescending(x => Vector3.Distance(x.transform.position, from)).FirstOrDefault();
        }

        public static T FurthestFrom<T>(this List<T> components, Vector3 from, float maxDistance, bool ignoreY = false) where T : Component
        {
            if (ignoreY)
                return components.Where(x => Vector3.Distance(x.transform.position.GetFlattened(), from.GetFlattened()) <= maxDistance).OrderByDescending(x => Vector3.Distance(x.transform.position.GetFlattened(), from.GetFlattened())).FirstOrDefault();
            else
                return components.Where(x => Vector3.Distance(x.transform.position, from) <= maxDistance).OrderBy(x => Vector3.Distance(x.transform.position, from)).FirstOrDefault();
        }
    }
}