using System;
using Server.Items;
using Server.Events.Halloween;

namespace Server.Engines.Events
{
	public class PumpkinPatchSpawner
	{
		private static Timer m_Timer;

		private static Rectangle2D[] m_PumpkinFields =
		{
				  new Rectangle2D( 4557, 1471, 20, 10 ),
				  new Rectangle2D( 796, 2152, 36, 24 ),
				  new Rectangle2D( 816, 2251, 16, 8 ),
				  new Rectangle2D( 816, 2261, 16, 8 ),
				  new Rectangle2D( 816, 2271, 16, 8 ),
				  new Rectangle2D( 816, 2281, 16, 8 ),
				  new Rectangle2D( 835, 2344, 16, 16 ),
				  new Rectangle2D( 816, 2344, 16, 24 )
		};

		public static void Initialize()
		{
			DateTime now = DateTime.UtcNow;

			if( DateTime.UtcNow >= HolidaySettings.StartHalloween && DateTime.UtcNow <= HolidaySettings.FinishHalloween )
			{
				m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromMinutes( .50 ), 0, new TimerCallback( PumpkinPatchSpawnerCallback ));
			}
		}

		protected static void PumpkinPatchSpawnerCallback()
		{
			AddPumpkin( Map.Felucca );
			AddPumpkin( Map.Trammel );
		}

		private static void AddPumpkin( Map map )
		{
			for( int i = 0; i < m_PumpkinFields.Length; i++ )
			{
				Rectangle2D rect = m_PumpkinFields[ i ];

				int spawncount = ( ( rect.Height * rect.Width ) / 20 );
				int pumpkins = 0;

				foreach( Item item in map.GetItemsInBounds( rect ) )
				{
					if( item is HalloweenPumpkin )
					{
						pumpkins++;
					}
				}

				if( spawncount > pumpkins )
				{
					Item item = new HalloweenPumpkin();

					item.MoveToWorld( RandomPointIn( rect, map ), map );
				}
			}
		}

		private static Point3D RandomPointIn( Rectangle2D rect, Map map )
		{
			int x = Utility.Random( rect.X, rect.Width );
			int y = Utility.Random( rect.Y, rect.Height );
			int z = map.GetAverageZ( x, y );

			return new Point3D( x, y, z );
		}
	}
}