using System;
using NHibernate.Type;
using NHibernate.Util;

namespace NHibernate.Mapping
{
	/// <summary>
	/// An array has a primary key consisting of the key columns + index column
	/// </summary>
	[Serializable]
	public class Array : List
	{
		private System.Type elementClass;
		private string elementClassName;

		public Array(PersistentClass owner) : base(owner)
		{
		}

		public System.Type ElementClass
		{
			get
			{
				if (elementClass == null)
				{
					if (elementClassName == null)
					{
						IType elementType = Element.Type;
						elementClass = IsPrimitiveArray ? ((PrimitiveType) elementType).PrimitiveClass : elementType.ReturnedClass;
					}
					else
					{
						try
						{
							elementClass = ReflectHelper.ClassForName(elementClassName);
						}
						catch (Exception cnfe)
						{
							throw new MappingException(cnfe);
						}
					}
				}
				return elementClass;
			}
		}

		public override CollectionType DefaultCollectionType
		{
			get { return TypeFactory.Array(Role, ReferencedPropertyName, ElementClass); }
		}

		public override bool IsArray
		{
			get { return true; }
		}

		public string ElementClassName
		{
			get { return elementClassName; }
			set
			{
				if ((elementClassName == null && value != null) || (elementClassName != null && !elementClassName.Equals(value)))
				{
					// the property change
					elementClassName = value;
					elementClass = null; // invalidate type
				}
			}
		}
	}
}