using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SuperTiled2Unity.Editor
{
    // Helper struct to deal with Tile Id values having burned-in flip flags
    public struct TileIdMath
    {
        // Flip flags from tiled
        private const uint TiledDiagonalFlipFlag = 0x20000000;
        private const uint TiledVerticalFlipFlag = 0x40000000;
        private const uint TiledHorizontalFlipFlag = 0x80000000;

        private uint m_ImportedTileId;
        private FlipFlags m_FlipFlags;

        public TileIdMath(uint importedTileId)
        {
            m_ImportedTileId = importedTileId;

            m_FlipFlags = 0;
            m_FlipFlags |= HasHorizontalFlip ? FlipFlags.Horizontal : 0;
            m_FlipFlags |= HasVerticalFlip ? FlipFlags.Vertical : 0;
            m_FlipFlags |= HasDiagonalFlip ? FlipFlags.Diagonal : 0;
        }

        // The tileId with baked in flip flags
        public uint ImportedlTileId { get { return m_ImportedTileId; } }

        // Just the raw tileId (no flip flags)
        public int JustTileId
        {
            get { return (int)(m_ImportedTileId & ~(TiledHorizontalFlipFlag | TiledVerticalFlipFlag | TiledDiagonalFlipFlag)); }
        }

        public FlipFlags FlipFlags { get { return m_FlipFlags; } }

        public bool HasHorizontalFlip
        {
            get { return (m_ImportedTileId & TiledHorizontalFlipFlag) != 0; }
        }

        public bool HasVerticalFlip
        {
            get { return (m_ImportedTileId & TiledVerticalFlipFlag) != 0; }
        }

        public bool HasDiagonalFlip
        {
            get { return (m_ImportedTileId & TiledDiagonalFlipFlag) != 0; }
        }

        public bool HasFlip
        {
            get { return HasHorizontalFlip || HasVerticalFlip || HasDiagonalFlip; }
        }
    }
}
