using System;
using System.Collections.Generic;

namespace Server.ACC.PG
{
	public enum EntryFlag
	{
		None      = 0x00000000,
		Generate  = 0x00000001,
		StaffOnly = 0x00000002,
		Reds      = 0x00000004,
		Young     = 0x00000008,
		Charge    = 0x00000010,
	}

	#region PGCategory Class
	public class PGCategory
	{
		private string    m_Name;
		private List<PGLocation> m_Locations;
		private EntryFlag m_Flags;
		private int       m_Cost;
        private int m_Hue;

		public string Name{ get{ return m_Name; } set{ m_Name = value; } }
		public List<PGLocation> Locations{ get{ return m_Locations; } set{ m_Locations = value; } }
		public EntryFlag Flags{ get{ return m_Flags; } set{ m_Flags = value; } }
        public int Cost { get { return m_Cost; } set { m_Cost = value; } }
        public int Hue { get { return m_Hue; } set { m_Hue = value; } }

		public bool GetFlag( EntryFlag flag ){ return( (m_Flags & flag) != 0 ); }

		public PGCategory( string name, EntryFlag flags ) : this( name, flags, 0, 1153 )
		{
		}

        public PGCategory(string name, EntryFlag flags, int cost ) : this (name, flags, cost, 1153 )
        {
        }

        public PGCategory(string name, EntryFlag flags, int cost, int hue)
        {
            m_Name = name;
            m_Locations = new List<PGLocation>();
            m_Flags = flags;
            m_Cost = cost;
            m_Hue = hue;
        }

		public PGCategory( GenericReader reader )
		{
			Deserialize( reader );
		}

		public void Serialize( GenericWriter writer )
		{
			writer.Write( 1 ); //version

            writer.Write(m_Hue);
			writer.Write( m_Name );

            writer.Write( m_Locations.Count );
            IEnumerator<PGLocation> Locs = m_Locations.GetEnumerator();
            while(Locs.MoveNext())
                Locs.Current.Serialize(writer);

			writer.Write( (int)m_Flags );
			writer.Write( (int)m_Cost );
		}

		public void Deserialize( GenericReader reader )
		{
			int version = reader.ReadInt();

            switch (version)
            {
                case 1:
                    {
                        m_Hue = reader.ReadInt();
                        goto case 0;
                    }
                case 0:
                    {
                        m_Name = reader.ReadString();

                        m_Locations = new List<PGLocation>();

                        for (int i = reader.ReadInt(); i > 0; i--)
                        {
                            m_Locations.Add(new PGLocation(reader));
                        }

                        m_Flags = (EntryFlag)reader.ReadInt();
                        m_Cost = reader.ReadInt();
                        break;
                    }
            }
		}
	}
	#endregion //PGCategory Class

	#region PGLocation Class
	public class PGLocation
	{
		private string    m_Name;
		private EntryFlag m_Flags;
		private Point3D   m_Location;
		private Map       m_Map;
		private int       m_Hue;
		private int       m_Cost;

		public string    Name{      get{ return m_Name; }      set{ m_Name = value; } }
		public EntryFlag Flags{     get{ return m_Flags; }     set{ m_Flags = value; } }
		public Point3D   Location{  get{ return m_Location; }  set{ m_Location = value; } }
		public Map       Map{       get{ return m_Map; }       set{ m_Map = value; } }
		public int       Hue{       get{ return m_Hue; }       set{ m_Hue = value; } }
		public int       Cost{      get{ return m_Cost; }      set{ m_Cost = value; } }

		public bool GetFlag( EntryFlag flag ){ return( (m_Flags & flag) != 0 ); }

		public PGLocation( string name, EntryFlag flags, Point3D location, Map map, int hue ) : this( name, flags, location, map, hue, 0 )
		{
		}

		public PGLocation( string name, EntryFlag flags, Point3D location, Map map, int hue, int cost )
		{
			m_Name = name;
			m_Flags = flags;
			m_Location = location;
			m_Map = map;
			m_Hue = hue;
			m_Cost = cost;
		}

		public PGLocation( GenericReader reader )
		{
			Deserialize( reader );
		}

		public void Serialize( GenericWriter writer )
		{
			writer.Write( (int)0 ); //version

			writer.Write( (string)m_Name );
			writer.Write( (int)m_Flags );
			writer.Write( m_Location );
			writer.Write( m_Map );
			writer.Write( m_Hue );
			writer.Write( m_Cost );
		}

		public void Deserialize( GenericReader reader )
		{
			int version = reader.ReadInt();

			m_Name = reader.ReadString();
			m_Flags = (EntryFlag)reader.ReadInt();
			m_Location = reader.ReadPoint3D();
			m_Map = reader.ReadMap();
			m_Hue = reader.ReadInt();
			m_Cost = reader.ReadInt();
		}
	}
	#endregion //PGLocation Class
}