using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Cajero
{
	/// <summary>
	/// Descripción breve de Form1.
	/// </summary>
	public class FCajero : System.Windows.Forms.Form, ISoporteDeTeclado
	{
		/// <summary>
		/// Variable del diseñador requerida.
		/// </summary>
		private System.ComponentModel.Container components = null;
		private Cajero.Teclado mTeclado;
		private Banco mBanco;
		private String mTipoComando;
		private String mTextoComando;
		private String mMenuPrincipal;
		private String mNumeroTarjeta;
		private String mImporte;

		public FCajero()
		{
			//
			// Necesario para admitir el Diseñador de Windows Forms
			//
			InitializeComponent();

			mMenuPrincipal="Menú principal\r\n\r\n1. Sacar dinero\r\n" +
				"2. Consultar saldo\r\n3. Realizar transferencias\r\n" +
				"4. Salir\r\n\r\n   Elija opción";
			try 
			{
				mBanco=new Banco(1201);
				mTextoComando="";
				mTipoComando="NUMERO TARJETA";
				mTeclado.setSoporte(this);
				muestra("Bienvenido al cajero. Por favor, teclee su número de tarjeta");
			}
			catch (Exception ex) 
			{
				muestra("Error de conexión:\n\r" + ex.Message);
			}
			}

		private void init() 
		{
			mTextoComando="";
			mTipoComando="NUMERO TARJETA";
			mTeclado.setSoporte(this);
			muestra("Bienvenido al cajero. Por favor, teclee su número de tarjeta");
		}

		/// <summary>
		/// Limpiar los recursos que se estén utilizando.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Código generado por el Diseñador de Windows Forms
		/// <summary>
		/// Método necesario para admitir el Diseñador. No se puede modificar
		/// el contenido del método con el editor de código.
		/// </summary>
		private void InitializeComponent()
		{
			this.mTeclado = new Cajero.Teclado();
			this.SuspendLayout();
			// 
			// mTeclado
			// 
			this.mTeclado.Location = new System.Drawing.Point(24, 24);
			this.mTeclado.Name = "mTeclado";
			this.mTeclado.Size = new System.Drawing.Size(408, 400);
			this.mTeclado.TabIndex = 0;
			// 
			// FCajero
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(576, 446);
			this.Controls.Add(this.mTeclado);
			this.Name = "FCajero";
			this.Text = "Cajero automático";
			this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// Punto de entrada principal de la aplicación.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new FCajero());
		}

		public void recibirPulsacion(String texto) 
		{
			if (texto.Equals("Cancelar"))
				init();
			else if (this.mTipoComando.Equals("NUMERO TARJETA")) 
			{
				procesaNumeroTarjeta(texto);
			} 
			else if (this.mTipoComando.Equals("MENU PRINCIPAL")) 
			{
				if (char.IsDigit(texto, 0)) 
				{
					if (texto.Equals("1")) 
					{
						mTextoComando="";
						mTipoComando="SACAR DINERO";
						muestra("Teclee importe y pulse Confirmar: ");
					} 
				} 
			} 
			else if (this.mTipoComando.Equals("SACAR DINERO")) 
			{
				this.procesaSacarDinero(texto);
			}
		}

		private void procesaSacarDinero(String texto) 
		{
			if (char.IsDigit(texto, 0)) 
			{
				mTextoComando=mTextoComando+texto;
				muestra("Teclee importe y pulse Confirmar: " + 
					mTextoComando);
			} 
			else if (texto.Equals("Corregir") && char.IsDigit(mTextoComando.Substring(mTextoComando.Length-1, 1), 0)) 
			{
				mTextoComando=mTextoComando.Substring(0, mTextoComando.Length-1);
				muestra("Teclee importe y pulse Continar: " + 
					mTextoComando);
			} 
			else if (texto.Equals("Confirmar")) 
			{
				int largo="Teclee importe y pulse Confirmar: ".Length;
				mImporte=mTextoComando;
				this.mBanco.Enviar("SACAR" + this.mNumeroTarjeta +
					this.mImporte + "#");
			}
		}

		private void procesaNumeroTarjeta(String texto) {
			if (char.IsDigit(texto, 0)) 
			{
				mTextoComando+=texto;
				mTeclado.mostrar("Tarjeta número: " + mTextoComando);
				if (mTextoComando.Length==16) 
				{
					int largo="Tarjeta número: ".Length;
					this.mNumeroTarjeta=mTextoComando;
					mTipoComando="MENU PRINCIPAL";
					muestra(mMenuPrincipal);
				}
			} 
			else if (texto.Equals("Corregir")) 
			{
				mTextoComando=(mTextoComando.Length<=1 ? "" : mTextoComando.Substring(0, mTextoComando.Length-1));
				mTeclado.mostrar("Tarjeta número: " + mTextoComando);
			} 
			else if (texto.Equals("Cancelar")) 
			{
				init();
			}
		}

		private void muestra(String msg) 
		{
			mTeclado.mostrar(msg);	
		}
	}
}
