using System;
using Server;

namespace Server.Items
{
    public class MiniHouseAddon : BaseAddon
    {
        private MiniHouseType m_Type;

        [CommandProperty(AccessLevel.GameMaster)]
        public MiniHouseType Type
        {
            get { return m_Type; }
            set { m_Type = value; Construct(); }
        }

        public override BaseAddonDeed Deed { get { return new MiniHouseDeed(m_Type); } }

        [Constructable]
		public MiniHouseAddon() : this( MiniHouseType.StoneAndPlaster )
        {
        }

        [Constructable]
        public MiniHouseAddon(MiniHouseType type)
        {
            m_Type = type;

            Construct();
        }

        public void Construct()
        {
            foreach (AddonComponent c in Components)
            {
                c.Addon = null;
                c.Delete();
            }

            Components.Clear();

            MiniHouseInfo info = MiniHouseInfo.GetInfo(m_Type);

            int size = (int)Math.Sqrt(info.Graphics.Length);
            int num = 0;

            for (int y = 0; y < size; ++y)
                for (int x = 0; x < size; ++x)
                    if (info.Graphics[num] != 0x1) // Veteran Rewards Mod
                        AddComponent(new AddonComponent(info.Graphics[num++]), size - x - 1, size - y - 1, 0);
        }

		public MiniHouseAddon( Serial serial ) : base( serial )
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version

            writer.Write((int)m_Type);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {
                case 0:
                    {
                        m_Type = (MiniHouseType)reader.ReadInt();
                        break;
                    }
            }
        }
    }

    public class MiniHouseDeed : BaseAddonDeed
    {
        private MiniHouseType m_Type;

        [CommandProperty(AccessLevel.GameMaster)]
        public MiniHouseType Type
        {
            get { return m_Type; }
			set{ m_Type = value; InvalidateProperties(); }
            }

        public override BaseAddon Addon { get { return new MiniHouseAddon(m_Type); } }
		public override int LabelNumber{ get{ return 1062096; } } // a mini house deed

        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            list.Add(MiniHouseInfo.GetInfo(m_Type).LabelNumber);
        }

        [Constructable]
		public MiniHouseDeed() : this( MiniHouseType.StoneAndPlaster )
        {
        }

        [Constructable]
        public MiniHouseDeed(MiniHouseType type)
        {
			m_Type = type;

            Weight = 1.0;
            LootType = LootType.Blessed;
        }

		public MiniHouseDeed( Serial serial ) : base( serial )
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version

            writer.Write((int)m_Type);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {
                case 0:
                    {
                        m_Type = (MiniHouseType)reader.ReadInt();
                        break;
                    }
            }

            if (Weight == 0.0)
                Weight = 1.0;
        }
    }

    public enum MiniHouseType
    {
        StoneAndPlaster,
        FieldStone,
        SmallBrick,
        Wooden,
        WoodAndPlaster,
        ThatchedRoof,
        Brick,
        TwoStoryWoodAndPlaster,
        TwoStoryStoneAndPlaster,
        Tower,
        SmallStoneKeep,
        Castle,
        LargeHouseWithPatio,
        MarbleHouseWithPatio,
        SmallStoneTower,
        TwoStoryLogCabin,
        TwoStoryVilla,
        SandstoneHouseWithPatio,
        SmallStoneWorkshop,
        SmallMarbleWorkshop,
        MalasMountainPass,	//Veteran reward house
		ChurchAtNight		//Veteran reward house
    }

    public class MiniHouseInfo
    {
        private int[] m_Graphics;
        private int m_LabelNumber;

        public int[] Graphics { get { return m_Graphics; } }
        public int LabelNumber { get { return m_LabelNumber; } }

        public MiniHouseInfo(int start, int count, int labelNumber)
        {
            m_Graphics = new int[count];

            for (int i = 0; i < count; ++i)
                m_Graphics[i] = start + i;

            m_LabelNumber = labelNumber;
        }

        public MiniHouseInfo(int labelNumber, params int[] graphics)
        {
            m_LabelNumber = labelNumber;
            m_Graphics = graphics;
        }

        private static MiniHouseInfo[] m_Info = new MiniHouseInfo[]
			{
				/* Stone and plaster house           */ new MiniHouseInfo( 0x22C4, 1, 1011303 ),
				/* Field stone house                 */ new MiniHouseInfo( 0x22DE, 1, 1011304 ),
				/* Small brick house                 */ new MiniHouseInfo( 0x22DF, 1, 1011305 ),
				/* Wooden house                      */ new MiniHouseInfo( 0x22C9, 1, 1011306 ),
				/* Wood and plaster house            */ new MiniHouseInfo( 0x22E0, 1, 1011307 ),
				/* Thatched-roof cottage             */ new MiniHouseInfo( 0x22E1, 1, 1011308 ),
				/* Brick house                       */ new MiniHouseInfo( 1011309, 0x22CD, 0x22CB, 0x22CC, 0x22CA ),
				/* Two-story wood and plaster house  */ new MiniHouseInfo( 1011310, 0x2301, 0x2302, 0x2304, 0x2303 ),
				/* Two-story stone and plaster house */ new MiniHouseInfo( 1011311, 0x22FC, 0x22FD, 0x22FF, 0x22FE ),
				/* Tower                             */ new MiniHouseInfo( 1011312, 0x22F7, 0x22F8, 0x22FA, 0x22F9 ),
				/* Small stone keep                  */ new MiniHouseInfo( 0x22E6, 9, 1011313 ),
				/* Castle                            */ new MiniHouseInfo( 1011314, 0x22CE, 0x22D0, 0x22D2, 0x22D7, 0x22CF, 0x22D1, 0x22D4, 0x22D9, 0x22D3, 0x22D5, 0x22D6, 0x22DB, 0x22D8, 0x22DA, 0x22DC, 0x22DD ),
				/* Large house with patio            */ new MiniHouseInfo( 0x22E2, 4, 1011315 ),
				/* Marble house with patio           */ new MiniHouseInfo( 0x22EF, 4, 1011316 ),
				/* Small stone tower                 */ new MiniHouseInfo( 0x22F5, 1, 1011317 ),
				/* Two-story log cabin               */ new MiniHouseInfo( 0x22FB, 1, 1011318 ),
				/* Two-story villa                   */ new MiniHouseInfo( 0x2300, 1, 1011319 ),
				/* Sandstone house with patio        */ new MiniHouseInfo( 0x22F3, 1, 1011320 ),
				/* Small stone workshop              */ new MiniHouseInfo( 0x22F6, 1, 1011321 ),
				/* Small marble workshop             */ new MiniHouseInfo( 0x22F4, 1, 1011322 ),
				/* Malas Mountain Pass               */ new MiniHouseInfo( 1062692, 0x2316, 0x2315, 0x2314, 0x2313 ),
				/* Church At Night                   */ new MiniHouseInfo( 1072215, 0x2318, 0x2317, 0x2319, 0x1 )
			};

        public static MiniHouseInfo GetInfo(MiniHouseType type)
        {
            int v = (int)type;

            if (v < 0 || v >= m_Info.Length)
                v = 0;

            return m_Info[v];
        }
    }
}