using System;
using Server;
using Server.Gumps;
using Server.Network;
using System.Collections;
using System.Collections.Generic;

namespace Server.Items
{
	public class PowerScroll : SpecialScroll
	{
		public override int Message { get { return 1049469; } } /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics.
																* When used, the effect is not immediately seen without a gain of points with that skill or statistics.
																* You can view your maximum skill values in your skills window.
																* You can view your maximum statistic value in your statistics window. */
		public override int Title
		{
			get
			{
				double level = ( Value - 105.0 ) / 5.0;
			
				if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
					return 1049635 + (int)level;	/* Wonderous Scroll (105 Skill): OR
													* Exalted Scroll (110 Skill): OR
													* Mythical Scroll (115 Skill): OR
													* Legendary Scroll (120 Skill): */

				return 0;
			}
		}

		public override string DefaultTitle{ get{ return String.Format( "<basefont color=#FFFFFF>Power Scroll ({0} Skill):</basefont>", Value ); } }

		private static SkillName[] m_Skills = new SkillName[]
			{
				SkillName.Blacksmith,
				SkillName.Tailoring,
				SkillName.Swords,
				SkillName.Fencing,
				SkillName.Macing,
				SkillName.Archery,
				SkillName.Wrestling,
				SkillName.Parry,
				SkillName.Tactics,
				SkillName.Anatomy,
				SkillName.Healing,
				SkillName.Magery,
				SkillName.Meditation,
				SkillName.EvalInt,
				SkillName.MagicResist,
				SkillName.AnimalTaming,
				SkillName.AnimalLore,
				SkillName.Veterinary,
				SkillName.Musicianship,
				SkillName.Provocation,
				SkillName.Discordance,
				SkillName.Peacemaking
			};

		private static SkillName[] m_AOSSkills = new SkillName[]
			{
				SkillName.Chivalry,
				SkillName.Focus,
				SkillName.Necromancy,
				SkillName.Stealing,
				SkillName.Stealth,
				SkillName.SpiritSpeak
			};

		private static SkillName[] m_SESkills = new SkillName[]
			{
				SkillName.Ninjitsu,
				SkillName.Bushido
			};

		private static SkillName[] m_MLSkills = new SkillName[]
			{
				SkillName.Spellweaving
			};

		private static List<SkillName> _Skills = new List<SkillName>();

		public static List<SkillName> Skills
		{
			get
			{
				if ( _Skills.Count == 0 )
				{
					switch ( Core.Expansion )
					{
						case Expansion.ML: _Skills.AddRange( m_MLSkills ); goto case Expansion.SE;
						case Expansion.SE: _Skills.AddRange( m_SESkills ); goto case Expansion.AOS;
						case Expansion.AOS: _Skills.AddRange( m_AOSSkills ); goto default;
						default: _Skills.AddRange( m_Skills ); break;
					}
				}

				return _Skills;
			}
		}

		public static PowerScroll CreateRandom( int min, int max )
		{
			min /= 5;
			max /= 5;

			return new PowerScroll( Skills[Utility.Random( Skills.Count )], 100 + ( Utility.RandomMinMax( min, max ) * 5 ) );
		}

		public static PowerScroll CreateRandomNoCraft( int min, int max )
		{
			min /= 5;
			max /= 5;

			SkillName skillName;

			do
			{
				skillName = Skills[Utility.Random( Skills.Count )];
			} while ( skillName == SkillName.Blacksmith || skillName == SkillName.Tailoring );

			return new PowerScroll( skillName, 100 + (Utility.RandomMinMax( min, max ) * 5));
		}

		public PowerScroll() : this( SkillName.Alchemy, 0.0 )
		{
		}

		[Constructable]
		public PowerScroll( SkillName skill, double value ) : base( skill, value )
		{
			Hue = 0x481;

            if (Value == 105.0 || skill == Server.SkillName.Blacksmith || skill == Server.SkillName.Tailoring )
				LootType = LootType.Regular;
		}

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

		public override void AddNameProperty( ObjectPropertyList list )
		{
			double level = ( Value - 105.0 ) / 5.0;
			
			if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
				list.Add( 1049639 + (int)level, GetNameLocalized() );	/* a wonderous scroll of ~1_type~ (105 Skill) OR
																		* an exalted scroll of ~1_type~ (110 Skill) OR
																		* a mythical scroll of ~1_type~ (115 Skill) OR
																		* a legendary scroll of ~1_type~ (120 Skill) */
			else
				list.Add( "a power scroll of {0} ({1} Skill)", GetName(), Value );
		}

		public override void OnSingleClick( Mobile from )
		{
			double level = ( Value - 105.0 ) / 5.0;
			
			if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 )
				base.LabelTo( from, 1049639 + (int)level, GetNameLocalized() );
			else
				base.LabelTo( from, "a power scroll of {0} ({1} Skill)", GetName(), Value );
		}

		public override bool CanUse( Mobile from )
		{
			if ( !base.CanUse( from ) )
				return false;
			
			Skill skill = from.Skills[Skill];

			if ( skill == null )
				return false;

			if ( skill.Cap >= Value )
			{
				from.SendLocalizedMessage( 1049511, GetNameLocalized() ); // Your ~1_type~ is too high for this power scroll.
				return false;
			}

			return true;
		}

		public override void Use( Mobile from )
		{
			if ( !CanUse( from ) )
				return;

			from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~!

			from.Skills[Skill].Cap = Value;

			Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
			Effects.PlaySound( from.Location, from.Map, 0x243 );

			Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
			Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
			Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );

			Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );

			Delete();
		}

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

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

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

			int version = ( InheritsItem ? 0 : reader.ReadInt() ); //Required for SpecialScroll insertion

            if (Value == 105.0 || Skill == SkillName.Blacksmith || Skill == SkillName.Tailoring)
			{
				LootType = LootType.Regular;
			}
			else
			{
				LootType = LootType.Cursed;
				Insured = false;
			}
		}
	}
}