using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO.Ports;
using RFID.Properties;
using System.Windows.Forms.DataVisualization.Charting;

namespace RFID
{
   
    public partial class AppMain : Form
    {
        //Codigo BD
        private DateTime datetime;
        private DateTime datetime1;
        Boolean Editar;
        datosrfid ManipularDatos = new datosrfid();
        entradasalida ManipularDatos1 = new entradasalida();
        String Codigo = "";
        String Codigo1 = "";
        int conteo = 0;
        int Parqueaderos;

              



        //Codigo RFID

        protected IntPtr _handle = IntPtr.Zero;
        
        private bool InvalidHandle
        {
            get
            {
                if (_handle == IntPtr.Zero || -1 == (int)_handle)
                {
                    return false;
                }
                return true;
            }
        }
        public AppMain()
        {
            InitializeComponent();
            this.cbCom.SelectedIndex = 0;
            ComArduino.PortName = "COM12";
            ComArduino.BaudRate = 9600;
            ComArduino.Open();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            IntPtr p = IntPtr.Zero;
            try
            {
                int portNum = 1;
                p = EPCSDKHelper.OpenComm(portNum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            int main = 0;
            int sub = 0;

            bool b = EPCSDKHelper.ReadFirmwareVersion(p, out main, out sub, 0);


            int paramNum = 4;
            byte[] bo = new byte[paramNum];

            EPCSDKHelper.GetReaderParameters(p, 0, 4, bo, 0);


        }

      
        private void btnOpen_Click(object sender, EventArgs e)
        {
            
            int portNum = cbCom.SelectedIndex + 1;

            if (!InvalidHandle)
            {

                _handle = EPCSDKHelper.OpenComm(portNum);
                if (InvalidHandle)
                {
                    toolStripStatusLabel1.Text = string.Format("PUERTO SERIAL ABIERTO", portNum);
                    if (EPCSDKHelper.StopReading(_handle, 0))
                        toolStripStatusLabel1.Text = string.Format("CONECTADO");
                    else
                        toolStripStatusLabel1.Text = string.Format("FALLO LECTURA DE ETIQUETAS");
                }
                else
                {
                    toolStripStatusLabel1.Text = string.Format("FALLO APERTURA PUERTO SERIAL", portNum);
                }
            }
            else
            {
                toolStripStatusLabel1.Text = string.Format("PUERTO SERIAL ABIERTO", portNum);         
            }
        }
       
        private void btnClose_Click(object sender, EventArgs e)
        {
            int portNum = cbCom.SelectedIndex + 1;
            if (InvalidHandle)
            {

                EPCSDKHelper.CloseComm(_handle);
                _handle = IntPtr.Zero;
                toolStripStatusLabel1.Text = string.Format("DESCONECTANDO", portNum);
            }
            else
            {
                toolStripStatusLabel1.Text = string.Format("DESCONECTADO", portNum);
            }
        }

      
        private void timerReadMultiTag_Tick(object sender, EventArgs e)
        {
            
            byte[] ids = new byte[12 * 200];	// The id length of each is 12, so 12 * 200 bytes is needed
            byte[] devNos = new byte[200];
            byte[] antennaNos = new byte[200];

        }
                       
        private void btnRead_Click(object sender, EventArgs e)// controla el boton de leer no puedo encontrar un metodo para contenerlo y hacer un while o un timer 
        {
            byte[] data = new byte[2];
            if (EPCSDKHelper.ReadTag(_handle, 0x01, 0x02, 6, data, 0))  // 
            {
                byte[] bTmp = new byte[2];
                Buffer.BlockCopy(data, 0, bTmp, 0, 2);
                this.txtTag.Text = TextEncoder.ByteArrayToHexString(bTmp);
            }
            else
            {
                this.txtTag.Text = "Sin lectura";
            }

        }
        
        private void txtTag_TextChanged(object sender, EventArgs e)// escribe la tarjeta que lee en el espacio de la app, tambien debe ir dentro del while
        { 
            
        }
             

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void cbCom_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }



        //Codigo BD
       
        private void btnActualizar_Click(object sender, EventArgs e)
        {
            Editar = true;
            //CAPTURA LOS DATOS DEL DATAGRIDVIEW Y LOS ASIGNA A LAS CAJAS DE TEXTO
            Codigo = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
            txt1Nombre.Text = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
            txt1Apellido.Text = this.dataGridView1.CurrentRow.Cells[2].Value.ToString();
            txtFacultad.Text = this.dataGridView1.CurrentRow.Cells[3].Value.ToString();
        }

        private void AppMain_Load(object sender, EventArgs e)
        {
            Editar = false;
            //CREAR OBJETOS PARA CONEXION CON LA BASE DE DATOS
            datosrfid objeto = new datosrfid();
            objeto.ActualizarGrid(this. dataGridView1, "select * from datosrfid");
            entradasalida objeto1 = new entradasalida();
            objeto1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida");          
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            //CONDICION DE GUARDADO SI EL USUARIO A OPRIMIDO BOTON DE ACTUALIZAR
            if (Editar)
            {
                //CONECTAR CON LA BASE DE DATOS
                ManipularDatos.Conectar();
                //ARMAR LA CONSULTA
                String Query = "update datosrfid set NOMBRES = '" + txt1Nombre.Text + "', APELLIDOS = '" + txt1Apellido.Text + "', FACULTAD = '" + txtFacultad.Text + "' where CODIGO = '" + Codigo + "';";
                //EJECTAR LA CONSULTA
                ManipularDatos.EjecutarSql(Query);
                //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                ManipularDatos.ActualizarGrid(this.dataGridView1, "select * from datosrfid;");
                //DESCONECTAR LA BASE DE DATOS
                ManipularDatos.Desconectar();
                //LIMPIAR CAJAS DE TEXTO
                this.LimpiarCajasTexto();
                Editar = false;
            }
            else
            {
                //CONECTAR CON LA BASE DE DATOS
                ManipularDatos.Conectar();
                //ARMAR LA CONSULTA
                String Query = "insert into datosrfid (CODIGO,NOMBRES,APELLIDOS,FACULTAD) values ('" + txtTag.Text + "','" + txt1Nombre.Text + "','" + txt1Apellido.Text + "','" + txtFacultad.Text + "');";
                //EJECTAR LA CONSULTA
                ManipularDatos.EjecutarSql(Query);
                //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                ManipularDatos.ActualizarGrid(this.dataGridView1, "select * from datosrfid;");
                //DESCONECTAR LA BASE DE DATOS
                ManipularDatos.Desconectar();
                //LIMPIAR CAJAS DE TEXTO
                this.LimpiarCajasTexto();
            }
        }
        //FUNCION LIMPIAR CAJAS DE TEXTO
            public void LimpiarCajasTexto()
        {
            txt1Nombre.Text = "";
            txt1Apellido.Text = "";
            txtFacultad.Text = "";
            txtTag.Text = "";
        }            

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            //CAPTURA EL CODIGO DE LA BASE DE DATOS datosrfid
            Codigo = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
            //PREGUNTA AL USUARIO SI DESEA ELIMINAR EL REGISTRO
            var resultado = MessageBox.Show("¿Desear realmente eliminar este registro?", "Confirme el borrado", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            //EVALUA EL RESULTADO DE LA RESPUESTA
            if (resultado == DialogResult.Yes) //CONDICION PARA RESPUESTA AFIRMATIVA
            {
                //PROCEDE A HACER EL BORRADO DEL REGISTRO PARA ESO PRIMERO>
                //CONECTAR CON LA BASE DE DATOS
                ManipularDatos.Conectar();
                //ARMAR LA CONSULTA
                String Query = "delete from datosrfid where CODIGO = '" + Codigo + "';";
                //EJECUTAR LA CONSULTA
                ManipularDatos.EjecutarSql(Query);
                //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                ManipularDatos.ActualizarGrid(this.dataGridView1, "select * from datosrfid;");
                //DESCONECTA LA BASE DE DATOS
                ManipularDatos.Desconectar();
            }
            else
                //SI LA RESPUESTA ES NEGATIVA EL PROGRAMA NO EJECUTA NADA
                return;
        }
        //FUNCION PARA PUERTO SERIAL DEL ARDUINO
        private void AppMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (ComArduino.IsOpen) ComArduino.Close();            
        }

        //FUNCION DE ACCION DE BOTON PARA INGRESO DE HORA DE ENTRADA       
        private void btnEntrada_Click(object sender, EventArgs e)
        {
            //HACE LECTURA DE LA ETIQUETA
            byte[] data = new byte[2];
            if (EPCSDKHelper.ReadTag(_handle, 0x01, 0x02, 6, data, 0))  // 
            {
                byte[] bTmp = new byte[2];
                Buffer.BlockCopy(data, 0, bTmp, 0, 2);
                this.txtBuscar.Text = TextEncoder.ByteArrayToHexString(bTmp);
                //ALMACENA EN VARIABLES LOS CODIGOS PARA VERIFICAR LUEGO SE EXISTE EN LA BASE DE DATOS
                string CODIGOGUARDADO = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
                string LECTURACODIGO = TextEncoder.ByteArrayToHexString(bTmp);                
                //VERIFICA SI EL CODIGO DE ETIQUETA LEIDO ESTA GUARDADO EN LA BASE DE DATOS 
                if (LECTURACODIGO == CODIGOGUARDADO)
                {
                    //SI LA CONDICION ES VERDADERA EJECUTA LAS SIGUIENTES INSTRUCCIONES
                    //ADICIONA NUMERO DE PARQUEADERO OCUPADOS Y LO MUESTRA EN LA CAJA DE TEXTO
                    Parqueaderos = Parqueaderos + 1;
                    string datos1 = Convert.ToString(Parqueaderos);
                    txtParqueaderos.Text = datos1;
                    if (Parqueaderos == 89)
                    {
                        txtParqueaderos.Text = "SIN CUPOS";
                    }                    
                    conteo = conteo+1;
                    //ENVIA DATO AL ARDUINO PARA HABILITAR INGRESO AL USUARIO
                    Envio.Text = "Enviado";
                    ComArduino.Write("1");
                    //TOMA VALORES ACTUALES DE FECHA Y HORA PARA INGRESO A LA BASE DE DATOS DE REGISTRO DE HISTORICOS
                    datetime = DateTime.Now;
                    txtEntrada.Text = datetime.Hour + " : " + datetime.Minute + " : " + datetime.Second;
                    txtFecha.Text = datetime.Day + " / " + datetime.Month + " / " + datetime.Year;
                    //CONECTA CON LA BASE DE DATOS
                    ManipularDatos1.Conectar1();
                    //ARMAR LA CONSULTA
                    String Query1 = "insert into entradasalida (CODIGO,ENTRADA,SALIDA,FECHA,NUMERO) values ('" + txtBuscar.Text + "','" + txtEntrada.Text + "','"  +"ENTRADA" + "','" + txtFecha.Text + "'," + conteo + ");";
                    //EJECUTA LA CONSULTA
                    ManipularDatos1.EjecutarSql1(Query1);
                    //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                    ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida;");                    
                    //DESCONECTA LA BASE DE DATOS
                    ManipularDatos1.Desconectar1();
                }
                else
                {
                    //INSTRUCCIONES PARA CUANDO EL USUARIO NO ESTA EN LA BASE DE DATOS
                    ComArduino.Write("0");
                    Envio.Text = "";
                }
            }
            else
            {
                //INSTRUCCIONES PARA CUANDO NO HAY LECTURA DE ETIQUETA
                this.txtBuscar.Text = "";
                ComArduino.Write("0");
                Envio.Text = "";
            }
            //SELECCIONA CODIGO DE LA BASE DE DATOS PARA VERIFICAR QUE USUARIO ESTA POR INGRESAR
            ManipularDatos.ActualizarGrid(this.dataGridView1, "select * from datosrfid where CODIGO like '" + txtBuscar.Text + "%';");   
            //ORDENA TABLA POR ORDEN DE INGRESO
            ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select CODIGO, ENTRADA, SALIDA, FECHA, NUMERO from entradasalida order by NUMERO ASC;");
        }

        //FUNCION DE ACCION DE BOTON PARA BUSQEUDA DE USUARIO PARA INGRESO DE HORA DE SALIDA 
        private void btnAc_Click(object sender, EventArgs e)
        {
            //LECTURA DE ETIQUETA
            byte[] data = new byte[2];
            if (EPCSDKHelper.ReadTag(_handle, 0x01, 0x02, 6, data, 0))  // 
            {
                byte[] bTmp = new byte[2];
                Buffer.BlockCopy(data, 0, bTmp, 0, 2);
                this.txtBuscar.Text = TextEncoder.ByteArrayToHexString(bTmp);
            }
            else
            {
                this.txtBuscar.Text = "";
            }
            //LA VARIABLE Codigo1 TOMA LOS VALORES DE LA TABLA DE LA BASE DE DATOS
            Codigo1 = this.dataGridView2.CurrentRow.Cells[0].Value.ToString();
            //UBICA LA CELDA PARA INGRESO DE HORA DE SALIDA            
            txtSalida.Text = this.dataGridView2.CurrentRow.Cells[2].Value.ToString();
            ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida where CODIGO like '" + txtBuscar.Text + "%';");            
        }

        //FUNCION DE ACCION DE BOTON PARA INGRESO DE HORA DE SALIDA
        private void btnSalida_Click(object sender, EventArgs e)
        {           
            //LECTURA DE ETIQUETA
            byte[] data = new byte[2];
            if (EPCSDKHelper.ReadTag(_handle, 0x01, 0x02, 6, data, 0))  // 
            {
                byte[] bTmp = new byte[2];
                Buffer.BlockCopy(data, 0, bTmp, 0, 2);
                this.txtBuscar.Text = TextEncoder.ByteArrayToHexString(bTmp);
                //ALMACENA EN VARIABLES LOS CODIGOS PARA VERIFICAR LUEGO SE EXISTE EN LA BASE DE DATOS
                string CODIGOGUARDADO = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
                string LECTURACODIGO = TextEncoder.ByteArrayToHexString(bTmp);
                //VERIFICA SI EL CODIGO DE ETIQUETA LEIDO ESTA GUARDADO EN LA BASE DE DATOS
                if (LECTURACODIGO == CODIGOGUARDADO)
                {
                    //SI LA CONDICION ES VERDADERA EJECUTA LAS SIGUIENTES INSTRUCCIONES
                    //RESTA NUMERO DE PARQUEADERO OCUPADOS Y LO MUESTRA EN LA CAJA DE TEXTO
                    Parqueaderos = Parqueaderos - 1;
                    string datos1 = Convert.ToString(Parqueaderos);
                    txtParqueaderos.Text = datos1;
                    //ENVIA DATO AL ARDUINO PARA HABILITAR SALIDA DEL USUARIO
                    Envio.Text = "Enviado";
                    ComArduino.Write("2");
                    //TOMA VALORES ACTUALES DE HORA PARA INGRESO A LA BASE DE DATOS DE REGISTRO DE HISTORICOS
                    datetime1 = DateTime.Now;
                    txtSalida.Text = datetime1.Hour + " : " + datetime1.Minute + " : " + datetime1.Second;
                    //BUSCA EL ESPACIO EN DONDE DEBE IR UBICADO EL DATO DE HORA DE SALIDA EN LA TABLA DE LA BASE DE DATOS
                    string entrada = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
                    string entr = "ENTRADA";
                    //CONECTA CON LA BASE DE DATOS
                    ManipularDatos1.Conectar1();
                    //ARMAR LA CONSULTA
                    String Query1 = "update entradasalida set SALIDA = '" + txtSalida.Text + "' where CODIGO = '" + Codigo1 + "' and SALIDA = '" + entr + "';";
                    //EJECUTA LA CONSULTA
                    ManipularDatos1.EjecutarSql1(Query1);
                    //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                    ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida;");
                    //DESCONECTA LA BASE DE DATOS
                    ManipularDatos1.Desconectar1();
                    ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida where NUMERO like '" + conteo + "%';");                 
                }
                else
                {
                    //INSTRUCCIONES PARA CUANDO EL USUARIO NO ESTA EN LA BASE DE DATOS
                    ComArduino.Write("0");
                    Envio.Text = "";
                }
            }
            else
            {
                //INSTRUCCIONES PARA CUANDO NO HAY LECTURA DE ETIQUETA
                this.txtBuscar.Text = "";
                ComArduino.Write("0");
                Envio.Text = "";
            }
            //SELECCIONA CODIGO DE LA BASE DE DATOS PARA VERIFICAR QUE USUARIO ESTA POR INGRESAR
            ManipularDatos.ActualizarGrid(this.dataGridView1, "select * from datosrfid where CODIGO like '" + txtBuscar.Text + "%';");
            //ORDENA TABLA POR ORDEN DE INGRESO
            ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select CODIGO, ENTRADA, SALIDA, FECHA, NUMERO from entradasalida order by NUMERO ASC;");
        }
        //FUNCION PARA ACCION DE BORRADO DE REGISTRO DE HISTORICO POR USUARIO
        private void btnBorrarH_Click(object sender, EventArgs e)
        {
            //CAPTURA EL CODIGO DE LA BAE DE DATOS entradasalida
            Codigo1 = this.dataGridView2.CurrentRow.Cells[0].Value.ToString();
            //PREGUNTA AL USUARIO SI DESEA ELIINAR EL REGISTRO
            var resultado1 = MessageBox.Show("¿DESEAR ELIMINAR EL REGISTRO?", "CONFIRMAR BORRADO", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            //PROCEDE A ELIMINAR EL REGISTRO            
            if (resultado1 == DialogResult.Yes) //CONDICION PARA RESPUESTA AFIRMATIVO
            {
                //PROCEDE A HACER EL BORRADO DEL REGISTRO PARA ESO PRIMERO>
                //CONECTAR CON LA BASE DE DATOS
                ManipularDatos1.Conectar1();
                //ARMAR LA CONSULTA                
                String Query1 = "delete from entradasalida where CODIGO = '" + Codigo1 + "';";
                //EJECUTA LA CONSULTA
                ManipularDatos1.EjecutarSql1(Query1);
                //ACTUALIZAR LA CUADRICULA DE DATOS (DataGridView)
                ManipularDatos1.ActualizarGrid1(this.dataGridView2, "select * from entradasalida;");
                //DESCONECTA LA BASE DE DATOS
                ManipularDatos1.Desconectar1();
            }
            else
                //SI LA RESPUESTA ES NEGATIVA EL PROGRAMA NO EJECUTA NADA
                return;
        }        
    }
}
