/***************************************************************************
 *                                  Body.cs
 *                            -------------------
 *   begin                : May 1, 2002
 *   copyright            : (C) The RunUO Software Team
 *   email                : info@runuo.com
 *
 *   $Id$
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

using System;
using System.IO;

namespace Server
{
	public enum BodyType : byte
	{
		Empty,
		Monster,
		Sea,
		Animal,
		Human,
		Equipment
	}

	public struct Body
	{
		private int m_BodyID;

		private static BodyType[] m_Types;

		static Body()
		{
			if ( File.Exists( "Data/Config/bodyTable.cfg" ) )
			{
				using ( StreamReader ip = new StreamReader( "Data/Config/bodyTable.cfg" ) )
				{
					m_Types = new BodyType[1000];

					string line;

					while ( (line = ip.ReadLine()) != null )
					{
						if ( line.Length == 0 || line.StartsWith( "#" ) )
							continue;

						string[] split = line.Split( '\t' );

						try
						{
							int bodyID = int.Parse( split[0] );
							BodyType type = (BodyType)Enum.Parse( typeof( BodyType ), split[1], true );

							if ( bodyID >= 0 && bodyID < m_Types.Length )
								m_Types[bodyID] = type;
						}
						catch
						{
							Console.WriteLine( "Warning: Invalid bodyTable entry:" );
							Console.WriteLine( line );
						}
					}
				}
			}
			else
			{
				Console.WriteLine( "Warning: Data/Config/bodyTable.cfg does not exist" );

				m_Types = new BodyType[0];
			}
		}

		public Body( int bodyID )
		{
			m_BodyID = bodyID;
		}

		public BodyType Type
		{
			get
			{
				if ( m_BodyID >= 0 && m_BodyID < m_Types.Length )
					return m_Types[m_BodyID];
				else
					return BodyType.Empty;
			}
		}

		public bool IsHuman
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Human
					&& m_BodyID != 402
					&& m_BodyID != 403
					&& m_BodyID != 607
					&& m_BodyID != 608
					&& m_BodyID != 970;
			}
		}

		public bool IsMale
		{
			get
			{
				return m_BodyID == 183
					|| m_BodyID == 185
					|| m_BodyID == 400
					|| m_BodyID == 402
					|| m_BodyID == 605
					|| m_BodyID == 607
					|| m_BodyID == 750;
			}
		}

		public bool IsFemale
		{
			get
			{
				return m_BodyID == 184
					|| m_BodyID == 186
					|| m_BodyID == 401
					|| m_BodyID == 403
					|| m_BodyID == 606
					|| m_BodyID == 608
					|| m_BodyID == 751;
			}
		}

		public bool IsGhost
		{
			get
			{
				return m_BodyID == 402
					|| m_BodyID == 403
					|| m_BodyID == 607
					|| m_BodyID == 608
					|| m_BodyID == 970;
			}
		}

		public bool IsMonster
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Monster;
			}
		}

		public bool IsAnimal
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Animal;
			}
		}

		public bool IsEmpty
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Empty;
			}
		}

		public bool IsSea
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Sea;
			}
		}

		public bool IsEquipment
		{
			get
			{
				return m_BodyID >= 0
					&& m_BodyID < m_Types.Length
					&& m_Types[m_BodyID] == BodyType.Equipment;
			}
		}

		public int BodyID
		{
			get
			{
				return m_BodyID;
			}
		}

		public static implicit operator int( Body a )
		{
			return a.m_BodyID;
		}

		public static implicit operator Body( int a )
		{
			return new Body( a );
		}

		public override string ToString()
		{
			return string.Format( "0x{0:X}", m_BodyID );
		}

		public override int GetHashCode()
		{
			return m_BodyID;
		}

		public override bool Equals( object o )
		{
			if ( o == null || !(o is Body) ) return false;

			return ((Body)o).m_BodyID == m_BodyID;
		}

		public static bool operator == ( Body l, Body r )
		{
			return l.m_BodyID == r.m_BodyID;
		}

		public static bool operator != ( Body l, Body r )
		{
			return l.m_BodyID != r.m_BodyID;
		}

		public static bool operator > ( Body l, Body r )
		{
			return l.m_BodyID > r.m_BodyID;
		}

		public static bool operator >= ( Body l, Body r )
		{
			return l.m_BodyID >= r.m_BodyID;
		}

		public static bool operator < ( Body l, Body r )
		{
			return l.m_BodyID < r.m_BodyID;
		}

		public static bool operator <= ( Body l, Body r )
		{
			return l.m_BodyID <= r.m_BodyID;
		}
	}
}