using System;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Collections;
using banco1.persistencia;

namespace banco1.domain
{
	/// <summary>
	/// Descripción breve de Debito.
	/// </summary>
	public class Debito : Tarjeta
	{
		public Debito(String sucursal, String ccc) : base(sucursal, ccc)
		{
		}

		public Debito(Cuenta cuentaAsociada, Cliente titular) : base()
		{
			this.mCuentaAsociada=cuentaAsociada;
			this.setTitular(titular);
			this.mNumero=this.getNumeroSiguiente();
			this.mMesCaducidad=(byte) DateTime.Now.Month;
			this.mAñoCaducidad=(byte) (DateTime.Now.Year-2000+3);
			actualizaNumeroSiguiente(this.mNumero);
			this.mSucursal=cuentaAsociada.sucursal;
			this.mCCC=getCCCSiguiente(mSucursal);
			this.mFechaDeCreacion=DateTime.Now;
			this.mCuentaAsociada=cuentaAsociada;
			this.mActivo=true;
			insert();
			actualizaCCCSiguiente(sucursal, mCCC);
			mTitulares=new ArrayList();
		}

		public static Debito getTarjeta(String numero) 
		{
			String SQL="Select Sucursal, CCC from Tarjetas where " +
				"Número=?";
			OleDbCommand cmd=Broker.getCommand(SQL);
			cmd.Parameters.Add("", OleDbType.VarChar).Value=numero;
			OleDbDataReader r=cmd.ExecuteReader();
			String sucursal=null, ccc=null;
			if (r.Read()) 
			{
				sucursal=r.GetString(0);
				ccc=r.GetString(1);
			}
			cmd.Connection.Close();
			if (sucursal==null) 
				throw new Exception("Tarjeta no encontrada");
			return new Debito(sucursal, ccc);
		}

		public override void insert() 
		{
			base.insert();
			if (mCredito>0) 
				throw new Exception("Esta tarjeta es de débito, por lo que " +
					"no se le puede conceder crédito");
			if (mTitular==null || mTitular.Trim().Length==0)
				throw new Exception("Seleccione un titular");
			String SQL="Insert into Tarjetas " +
				"(Sucursal, CCC, Número, Titular, MesCaducidad, " +
				"AñoCaducidad, Crédito, SucursalCuentaAsociada, " +
				"CCCCuentaAsociada) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
			OleDbCommand cmd = Broker.getCommand(SQL);
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mSucursal;
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mCCC;
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mNumero;
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mTitular;
			cmd.Parameters.Add("", OleDbType.TinyInt).Value=this.mMesCaducidad;
			cmd.Parameters.Add("", OleDbType.TinyInt).Value=this.mAñoCaducidad;
			cmd.Parameters.Add("", OleDbType.Double).Value=0;
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mCuentaAsociada.sucursal;
			cmd.Parameters.Add("", OleDbType.VarChar).Value=this.mCuentaAsociada.ccc;
			cmd.ExecuteNonQuery();
			cmd.Connection.Close();
		}

		public override void sacarDinero(double importe) 
		{
			this.mCuentaAsociada.retirar(importe);
		}

		public override void pagarEnComercio(double importe, String comercio) 
		{
			this.mCuentaAsociada.reciboDomiciliado(comercio, importe);
		}
	}
}
