using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using RecrownedAthenaeum.Render;
using RecrownedAthenaeum.SpecialTypes;
using RecrownedAthenaeum.UI.SkinSystem.Definitions;

namespace RecrownedAthenaeum.UI.SkinSystem
{
    /// <summary>
    /// The output requirements of a skin. This allows for very customized skin systems if needed.
    /// </summary>
    public interface ISkin
    {
        /// <summary>
        /// The texture for the cursor.
        /// </summary>
        Texture2D CursorTexture { get; }

        /// <summary>
        /// Draws a region from the texture atlas.
        /// </summary>
        /// <param name="regionName">Region to draw.</param>
        /// <param name="color">The color to tint the region.</param>
        /// <param name="batch">The batch to use.</param>
        /// <param name="destination">The destination to draw to.</param>
        /// <param name="rotation">The rotation to use in radians.</param>
        /// <param name="origin">The origin for the rotation.</param>
        void Draw(string regionName, string color, ConsistentSpriteBatch batch, Rectangle destination, float rotation = 0, Vector2 origin = default(Vector2));

        /// <summary>
        /// Returns a <see cref="Color"/> with given name of defined color;
        /// Should use value "default" if <paramref name="name"/> is null.
        /// </summary>
        /// <param name="name">Name of defined color.</param>
        /// <returns>The defined color based on the name given.</returns>
        Color GetColor(string name = null);

        /// <summary>
        /// Returns a <see cref="TextureAtlas.Region"/> with given name of region.
        /// </summary>
        /// <param name="name">Name of region.</param>
        /// <param name="required">Whether or not the region is required. If true, it will throw an error if the region does not exist while if false, will return null if the region does not exist.</param>
        /// <returns>The region corresponding to the name and may return null depending on if the region exists, and is required.</returns>
        TextureAtlas.Region GetTextureAtlasRegion(string name, bool required = false);

        /// <summary>
        /// Returns the proper definition for the given parameters or throws exception in the case the requested definition does not exist.
        /// </summary>
        /// <typeparam name="T">Convenience to cast to the needed definition type.</typeparam>
        /// <param name="definitionName">The name of the definition. Default is null and will be replaced with "default" for name.</param>
        /// <returns>The definition cast to T.</returns>
        T ObtainDefinition<T>(string definitionName = null) where T : SkinDefinitionData;
    }
}