using UnityEngine;

namespace mgaia.tk2d
{
    /// <summary>
    /// Extensões para a classe tk2dSlicedSprite
    /// </summary>
    public static class Tk2dSlicedSpriteExtensions
    {
        /// <summary>
        /// Retorna as verdadeiras dimensões a partir das dimensões do mundo
        /// </summary>
        /// <owner>Victor</owner>
        public static Vector2 GetDimensionsFromWorldDimensions(this tk2dSlicedSprite slicedSprite, Vector2 worldDimensions)
        {
            float widthDimension = GetWidthDimensionFromWorldWidthDimension(slicedSprite, worldDimensions.x);
            float heightDimension = GetHeightDimensionFromWorldHeightDimension(slicedSprite, worldDimensions.y);

            return new Vector2(widthDimension, heightDimension);
        }

        /// <summary>
        /// Seta a propriedade dimensions de um tk2dSlicedSprite através de coordenadas do mundo, sem necessitar fazer a conversão para as dimensões reais
        /// </summary>
        /// <owner>Victor</owner>
        public static void SetWorldDimensions(this tk2dSlicedSprite slicedSprite, Vector2 dimensions)
        {
            SetWorldDimensionWidth(slicedSprite, dimensions.x);
            SetWorldDimensionHeight(slicedSprite, dimensions.y);
        }

        /// <summary>
        /// Retorna a verdadeira dimensão de largura a partir da dimensão de largura do mundo
        /// </summary>
        /// <owner>Victor</owner>
        public static float GetWidthDimensionFromWorldWidthDimension(this tk2dSlicedSprite slicedSprite, float worldWidth)
        {
            Vector2 texelSize = slicedSprite.CurrentSprite.texelSize;
            Vector2 scale = slicedSprite.scale;

            return worldWidth / texelSize.x / scale.x;
        }

        /// <summary>
        /// Retorna a verdadeira dimensão de largura a partir da dimensão de largura do mundo
        /// </summary>
        /// <owner>Victor</owner>
        public static float GetHeightDimensionFromWorldHeightDimension(this tk2dSlicedSprite slicedSprite, float worldHeight)
        {
            Vector2 texelSize = slicedSprite.CurrentSprite.texelSize;
            Vector2 scale = slicedSprite.scale;

            return worldHeight / texelSize.y / scale.y;
        }

        /// <summary>
        /// Seta a largura da propriedade dimensions de um tk2dSlicedSprite através de coordenadas do mundo, sem necessitar fazer a conversão para as dimensões reais
        /// </summary>
        /// <owner>Victor</owner>
        public static void SetWorldDimensionWidth(this tk2dSlicedSprite slicedSprite, float width)
        {
            float widthToSet = GetWidthDimensionFromWorldWidthDimension(slicedSprite, width);

            slicedSprite.dimensions = new Vector2(
                widthToSet,
                slicedSprite.dimensions.y
                );
        }

        /// <summary>
        /// Seta a altura da propriedade dimensions de um tk2dSlicedSprite através de coordenadas do mundo, sem necessitar fazer a conversão para as dimensões reais
        /// </summary>
        /// <owner>Victor</owner>
        public static void SetWorldDimensionHeight(this tk2dSlicedSprite slicedSprite, float height)
        {
            float heightToSet = GetHeightDimensionFromWorldHeightDimension(slicedSprite, height);

            slicedSprite.dimensions = new Vector2(
                slicedSprite.dimensions.x,
                heightToSet
                );
        }

        /// <summary>
        /// Retorna as dimensões no mundo de todas as bordas de um tk2dSlicedSprite
        /// </summary>
        /// <owner>Victor</owner>
        public static void GetWorldBordersSizes(this tk2dSlicedSprite slicedSprite, out float borderLeft, out float borderRight, out float borderTop, out float borderBottom)
        {
            Bounds boundsOfSprite = slicedSprite.GetBounds();

            borderLeft = slicedSprite.borderLeft * boundsOfSprite.size.x;
            borderRight = slicedSprite.borderRight * boundsOfSprite.size.x;
            borderTop = slicedSprite.borderTop * boundsOfSprite.size.y;
            borderBottom = slicedSprite.borderBottom * boundsOfSprite.size.y;
        }

        /// <summary>
        /// Retorna as dimensões de um slicedSprite a partir de coordenadas do mundo
        /// </summary>
        /// <owner>Victor</owner>
        public static Vector2 GetWorldDimensions(this tk2dSlicedSprite slicedSprite)
        {
            Vector2 scale = slicedSprite.scale;
            Vector2 texelSize = slicedSprite.GetCurrentSpriteDef().texelSize;
            Vector2 dimensions = slicedSprite.dimensions;

            return new Vector2(
                    dimensions.x * texelSize.x * scale.x,
                    dimensions.y * texelSize.y * scale.y
                );
        }
    }
}