using System;
using System.Collections.Generic;
using System.Text;
using CommonUI.Display;
using CommonLang;

namespace CommonUI.Cell
{
    public class SetObject
    {
        public int Index;
        public String Name;


    }

    public class ImagesSet : SetObject
    {
        public int Count;
        public int[] ClipsX;
        public int[] ClipsY;
        public int[] ClipsW;
        public int[] ClipsH;
        public String[] ClipsKey;

        public String Extention;
        public bool IsTiles;
        public String ImageInfo;

        public int TotalW;
        public int TotalH;
        public int SplitSize;

        /**String*/
        public String AppendData;

        public ImagesSet(int index, String name)
        {
            this.Index = index;
            this.Name = name;
        }

        public int getIndex()
        {
            return Index;
        }

        public String getName()
        {
            return Name;
        }

        public int getCount()
        {
            return Count;
        }

        public int getClipX(int i)
        {
            return ClipsX[i];
        }

        public int getClipY(int i)
        {
            return ClipsY[i];
        }

        public int getClipW(int i)
        {
            return ClipsW[i];
        }

        public int getClipH(int i)
        {
            return ClipsH[i];
        }

        public String getClipKey(int i)
        {
            return ClipsKey[i];
        }
    }

    public class MapSet : SetObject
    {

        public String ImagesName;

        public int XCount;
        public int YCount;
        public int CellW;
        public int CellH;
        public int LayerCount;

        public BlockType[] BlocksType;
        public int[] BlocksMask;
        public int[] BlocksX1;
        public int[] BlocksY1;
        public int[] BlocksX2;
        public int[] BlocksY2;
        public int[] BlocksW;
        public int[] BlocksH;

        /** [layer][y][x] */
        public int[,,] TerrainTile;
        public int[,,] TerrainFlip;
        public int[,,] TerrainFlag;

        /**String*/
        public String AppendData;


        public MapSet(int index, String name)
        {
            this.Index = index;
            this.Name = name;
        }


        public int getIndex()
        {
            return Index;
        }

        public String getName()
        {
            return Name;
        }

    }


    public class SpriteSet : SetObject
    {
        public String ImagesName;

        public bool ComplexMode;

        public float[] PartX;
        public float[] PartY;
        public float[] PartZ;
        public int[] PartTileID;
        public Trans[] PartTileTrans;
        public float[] PartAlpha;
        public float[] PartRotate;
        public float[] PartScaleX;
        public float[] PartScaleY;
        public float[] PartAnchorX;
        public float[] PartAnchorY;
        public short[][] Parts;

        public int[] BlocksMask;
        public float[] BlocksX1;
        public float[] BlocksY1;
        public float[] BlocksW;
        public float[] BlocksH;
        public short[][] Blocks;

        public int AnimateCount;
        public String[] AnimateNames;
        public short[][] FrameAnimate;
        public short[][] FrameCDMap;
        public short[][] FrameCDAtk;
        public short[][] FrameCDDef;
        public short[][] FrameCDExt;

        public float[][] FrameAlpha;

        public String[][] FrameDatas;

        /**String*/
        public String AppendData;


        public SpriteSet(int index, String name)
        {
            this.Index = index;
            this.Name = name;
        }


        public int getIndex()
        {
            return Index;
        }

        public String getName()
        {
            return Name;
        }

        public int getPartImageIndex(int anim, int frame, int subpart)
        {
            return PartTileID[Parts[FrameAnimate[anim][frame]][subpart]];
        }

        public Trans getPartTrans(int anim, int frame, int subpart)
        {
            return PartTileTrans[Parts[FrameAnimate[anim][frame]][subpart]];
        }

        public float getPartX(int anim, int frame, int subpart)
        {
            return PartX[Parts[FrameAnimate[anim][frame]][subpart]];
        }

        public float getPartY(int anim, int frame, int subpart)
        {
            return PartY[Parts[FrameAnimate[anim][frame]][subpart]];
        }

    }

    public class WorldSet : SetObject
    {
        public int GridXCount;
        public int GridYCount;
        public int GridW;
        public int GridH;
        public int Width;
        public int Height;

        public HashMap<int, SpriteObject> Sprs = new HashMap<int, SpriteObject>();
        public HashMap<int, MapObject> Maps = new HashMap<int, MapObject>();
        public HashMap<int, ImageObject> Imgs = new HashMap<int, ImageObject>();

        public HashMap<int, WaypointObject> WayPoints = new HashMap<int, WaypointObject>();
        public HashMap<int, RegionObject> Regions = new HashMap<int, RegionObject>();
        public HashMap<int, EventObject> Events = new HashMap<int, EventObject>();

        public String Data;
        /// <summary>
        /// y, x
        /// </summary>
        public int[,] Terrian;


        public WorldSet(int index, String name)
        {
            this.Index = index;
            this.Name = name;
        }


        public int getIndex()
        {
            return Index;
        }

        public String getName()
        {
            return Name;
        }

        public int getTerrainCell(int grid_x, int grid_y)
        {
            return Terrian[grid_x, grid_y];
        }


        public class MapObject
        {
            public int Index;
            public String UnitName;
            public String MapID;
            public String ImagesID;
            public int X;
            public int Y;
            public int Priority;
            public String Data;

        }

        public class SpriteObject
        {
            public int Index;
            public String UnitName;
            public String SprID;
            public String ImagesID;
            public int Anim;
            public int Frame;
            public int X;
            public int Y;
            public int Priority;
            public String Data;

        }




        public class ImageObject
        {
            public int Index;
            public String UnitName;
            public String ImagesID;
            public int TileID;
            public ImageAnchor ImgAnchor;
            public ImageTrans ImgTrans;
            public int X;
            public int Y;
            public int Priority;
            public String Data;

        }


        public class WaypointObject
        {
            public int Index;
            public int X;
            public int Y;
            public String Data;

            public HashMap<int, WaypointObject> Nexts = new HashMap<int, WaypointObject>();

        }

        public class RegionObject
        {
            public int Index;
            public int X;
            public int Y;
            public int W;
            public int H;
            public String Data;

        }

        public class EventObject
        {
            public int Index;
            public long ID;
            public String EventName;
            public String EventFile;
            public int X;
            public int Y;
            public String Data;
        }
    }

    public enum BlockType : int
    {

        CD_TYPE_RECT = 1,
        CD_TYPE_LINE = 2,
        CD_TYPE_POINT = 3,
    }

}