using System;
using System.Collections;
using System.Xml;

namespace banco1.domain
{
	/// <summary>
	/// Representa una cuenta corriente
	/// </summary>
	public class Cuenta : Producto
	{

		public Cuenta(String s, String ccc) : base(s, ccc)
		{
		}

		public Cuenta(String s, String ccc, bool activa, DateTime fechaCreacion, DateTime fechaCancel) :
			base(s, ccc, activa, fechaCreacion, fechaCancel)
		{
		}

		public override void cargaMovimientos(XmlNode nodoCuenta) 
		{
			if (nodoCuenta.ChildNodes.Count==1) 
				return;
			XmlNode movimientos=nodoCuenta.ChildNodes[1];
			for (int i=0; i<movimientos.ChildNodes.Count; i++) 
			{
				XmlNode nodoMovimiento=movimientos.ChildNodes[i];
				String concepto=nodoMovimiento.Attributes["concepto"].Value;
				DateTime fecha=DateTime.Parse(nodoMovimiento.Attributes["fecha"].Value);
				double importe=double.Parse(nodoMovimiento.Attributes["importe"].Value);
				Movimiento m=new Movimiento(concepto, fecha, importe);
				this.mMovimientos.Add(m);
			}
		}

		/*** Operaciones con dinero ****/
		public double saldo 
		{
			get { 
				double result=0;
				for (int i=0; i<this.mMovimientos.Count; i++) 
				{
					Movimiento m=(Movimiento) this.mMovimientos[i];
					result+=m.importe;
				}
				return result;
			}
		}

		public void ingresar(double importe) 
		{
			if (importe<=0)
				throw new Exception("Debe ingresar un importe positivo");
			if (this.cancelado || !this.estaActivo())
				throw new Exception("La cuenta está bloqueada o cancelada");
			Movimiento m=new Movimiento("Ingreso en efectivo", System.DateTime.Now, importe);
			this.mMovimientos.Add(m);
		}

		public void retirar(double importe) 
		{
			if (importe<=0)
				throw new Exception("Debe retirar un importe positivo");
			if (importe>saldo)
				throw new Exception("No dispone de suficiente saldo");
			if (this.cancelado || !this.estaActivo())
				throw new Exception("La cuenta está bloqueada o cancelada");
			importe=-importe;
			Movimiento m=new Movimiento("Retirada de efectivo", System.DateTime.Now, importe);
			this.mMovimientos.Add(m);
		}

		public void transferir(Cuenta destino, double importe) 
		{
			if (importe<=0)
				throw new Exception("Debe transferir un importe positivo");
			if (importe>saldo)
				throw new Exception("No dispone de suficiente saldo para realizar la operación");
			if (this.cancelado || !this.estaActivo())
				throw new Exception("La cuenta ordenante está bloqueada o cancelada");
			if (destino.cancelado || !destino.estaActivo())
				throw new Exception("La cuenta destino está bloqueada o cancelada");
			Movimiento m=new Movimiento("Orden de transferencia", System.DateTime.Now, -importe);
			this.mMovimientos.Add(m);
			Movimiento m2=new Movimiento("Transferencia a su favor", DateTime.Now, importe);
			destino.mMovimientos.Add(m2);
		}

		public void reciboDomiciliado(String organismo, double importe) 
		{
			if (this.cancelado || !this.estaActivo())
				throw new Exception("La cuenta está bloqueada o cancelada");
			Movimiento m=new Movimiento("Recibo de " + organismo, System.DateTime.Now, -importe);
			this.mMovimientos.Add(m);
		}

		/******* Otras operaciones ********/
		public override bool esCancelable() 
		{
			if (saldo<0 || !mActivo) return false;
			return true;
		}

	}
}
