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

/// <summary>
/// Class used to write extension methodes in
/// </summary>
public static class ExtensionMethods
{

    /// <summary>
    /// Converts provided Direction to Global Vector3
    /// </summary>
    /// <param name="direction">Direction to convert</param>
    /// <returns>Global Vector3 direction</returns>
    public static Vector3 ToVector(this Direction direction)
    {
        switch (direction)
        {
            case Direction.Forward:
                return Vector3.forward;
            case Direction.Right:
                return Vector3.right;
            case Direction.Back:
                return Vector3.back;
            case Direction.Left:
                return Vector3.left;
            default:
                return Vector3.zero;
        }
    }

    /// <summary>
    /// Converts provided Direction to local Vector3
    /// </summary>
    /// <param name="direction">Direction to convert</param>
    /// <param name="transform">Transform to use as directions local space</param>
    /// <returns>Local Vector3 direction</returns>
    public static Vector3 ToVector(this Direction direction, Transform transform)
    {
        switch (direction)
        {
            case Direction.Forward:
                return transform.forward;
            case Direction.Right:
                return transform.right;
            case Direction.Back:
                return -transform.forward;
            case Direction.Left:
                return -transform.right;
            default:
                return Vector3.zero;
        }
    }

    /// <summary>
    /// Gets the rect of a RectTransform in World coordinates
    /// </summary>
    /// <param name="rt">RectTransform to get rect from</param>
    /// <returns>rect of a RectTransform in World coordinates </returns>
    public static Rect GlobalRect(this RectTransform rt)
    {
        var r = rt.rect;

        Vector2 centre = rt.TransformPoint(r.center);
        r.size = rt.TransformVector(r.size);
        r.center = centre;
        return r;
    }

    

    /// <summary>
    /// Applies an action to each element in an IEnumerable
    /// </summary>
    /// <param name="enumeration">IEnumerable to loop therough</param>
    /// <param name="action">Action to apply to each element</param>
    public static void ForEach<T>(this IEnumerable<T> enumeration, System.Action<T> action)
    {
        foreach (T item in enumeration)
            action(item);
    }
}


