using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using LLNet.GUI;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using LLNet.Utils;

namespace LLNet.Tienda.MainForms.Forms.MisPuntos
{
    public partial class frmNumTarjeta : Form
    {
        private string varUrlPts, varCodemprPts, varCodsucPts;
        public string tarjeta = "0";
        public string pts = "0";

        public frmNumTarjeta()
        {
            InitializeComponent();
        }

        public frmNumTarjeta(string doc)
        {
            InitializeComponent();
            //tarjeta del pedido
            string TARJE = TarjetaDoc(doc);
            txtTarjet.Text = TARJE;
        }

        #region mConsDatosCedSinWeb
        private void mConsDatosCedSinWeb()
        {
            string vCedula = txtcedula.Text;
            string vTarjeta = txtTarjet.Text;
            Regex regxc = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$");//Expresión regular para el número de correo
            Utils.QueryParams pPametro = new LLNet.Utils.QueryParams();

            var VSplCed = txtcedula.Text.Split('-');

            if (VSplCed[0].Equals(" ") || VSplCed[0] == null || txtcedula.Text == "")
            {

                pPametro.AddReplaceParam("TARJETA", vTarjeta);
                if (CApp.bll.GetSingleValue("ConsultaEmailxTarjeta", pPametro, "PDV") == null)
                {
                    String tarjetaTemp = frmGestionCbb.ObtenerTarjetaValida(vTarjeta);
                    if (tarjetaTemp != "")
                    {
                        txtTarjet.Text = tarjetaTemp;
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("No existe tarjeta", "Mis Puntos", false);
                    }

                }
                else
                {
                    string vTarje = CApp.bll.GetSingleValue("ConsultaEmailxTarjeta", pPametro, "PDV").ToString();

                    string ValFactPts = (GUI.CApp.bll.GetSingleValue("GET_ACTUALIZA_VALUE", "PDV").ToString());
                    if (ValFactPts == "S")
                    {
                        if (vTarje == "" || !regxc.IsMatch(vTarje))
                        {
                            GUI.CApp.ShowMessage("Tiene el email nulo o incorrecto, verifique por favor", "Mis Puntos", false);
                            frmAfiliacion actualiz = new frmAfiliacion();
                            actualiz.txtMTarjet.Text = txtTarjet.Text;
                            actualiz.ShowDialog();
                        }

                    }else
                    {                       
                        //Validación no masiva , permanente                        
                        string ValperPts = CApp.bll.GetSingleValue("GET_ACTUALIZA_PERT", pPametro, "PDV").ToString();
                        if (ValperPts == "S")
                        {
                            GUI.CApp.ShowMessage("Favor actualizar los datos del cliente", "Mis Puntos", false);
                            frmAfiliacion actualiz = new frmAfiliacion();
                            actualiz.txtMTarjet.Text = txtTarjet.Text;
                            actualiz.ShowDialog();
                        }

                    }
                }
            }
            else
            {
                pPametro.AddReplaceParam("CEDULA", vCedula);
                if (CApp.bll.GetSingleValue("ConsultaEmail", pPametro, "PDV") == null)
                {

                    GUI.CApp.ShowMessage("No existe cédula", "Mis Puntos", false);
                }
                else
                {
                    string vCed = CApp.bll.GetSingleValue("ConsultaEmail", pPametro, "PDV").ToString();
                    string ValFactPts = (GUI.CApp.bll.GetSingleValue("GET_ACTUALIZA_VALUE", "PDV").ToString());
                    if (ValFactPts == "S")
                    {
                        // MessageBox.Show("HABILITADO");

                        if (vCed == "" || !regxc.IsMatch(vCed))
                        {
                            if (rbtnmcedula.Checked)
                            {
                                GUI.CApp.ShowMessage("Tiene el email nulo, debe actualizar los datos", "Mis Puntos", false);
                                frmAfiliacion actualiz = new frmAfiliacion();
                                actualiz.txtMCed.Text = txtcedula.Text;
                                //  actualiz.rbtnmpasaport.Checked = false;
                                actualiz.ShowDialog();
                            }
                            else
                            {

                                //MessageBox.Show("Tiene el Email nulo, Debe actualizar los datos");
                                GUI.CApp.ShowMessage("Tiene el Email nulo, Debe actualizar los datos", "Mis Puntos", false);
                                frmAfiliacion actualiz = new frmAfiliacion();

                                actualiz.rbtnmpasaport.Checked = true;
                                actualiz.txtMCed.Text = txtcedula.Text;
                                actualiz.ShowDialog();

                            }
                        }
                    }
                    else
                    {
                        //Validación no masiva , permanente                        
                        string ValperPts = CApp.bll.GetSingleValue("GET_ACTUALIZA_PERC", pPametro, "PDV").ToString();
                        if (ValperPts == "S")
                        {
                            GUI.CApp.ShowMessage("Favor actualizar los datos del cliente", "Mis Puntos", false);
                            frmAfiliacion actualiz = new frmAfiliacion();
                            actualiz.txtMTarjet.Text = txtTarjet.Text;
                            actualiz.ShowDialog();
                        }

                    }
                }
            }
        }
        #endregion

        private string TarjetaDoc(string doc)
        {
            string tarjeta = ""; //Matriz de Productos
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pDocumento", doc);

            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "TarjetaDOC", qp);
            //DataRow fila;

            if (dsB.Tables.Count > 0)
            {
                int cont = 0;
                foreach (DataRow Fila in dsB.Tables[0].Rows)
                {
                    tarjeta = Convert.ToString(Fila[0]); //Tarjeta del Pedido                    
                }
            }
            return tarjeta;
        }

        private void btnTarjeta_Click(object sender, EventArgs e)
        {
            string nombr = "";
            //valida la cantidad de puntos por el factor
            decimal ValFactPts = decimal.Parse(GUI.CApp.bll.GetSingleValue("C_Factor", "PDV").ToString());

            if ((txtcedula.Text == "" || txtcedula.Text == " -    -"))
            {   //llamada x tarjeta
                /* if (txtTarjet.Text.Trim().Length != 16 && txtTarjet.Text.Trim().Length != 20)
                 {            
                     this.txtTarjet.Focus();
                     CApp.ShowMessage("¡El número de tarjeta debe ser de 16 o 20 caracteres!", "Afiliación", true);
                 }
                 else
                 { */
                mConsDatosCedSinWeb();
                //BUSCA X TARJETA
                tarjeta = txtTarjet.Text;
                //nombre del cliente
                nombr = ConsDatos();
                if (tarjeta != "0")
                {
                    pts = Consultar_Puntos(tarjeta);
                    //Almacena los datos en nuestra Base d Datos
                    Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                    //pTARJETA,pCEDULA,pNOMBRE,pAPELLIDO1,pAPELLIDO2,pTELEFONO1,pTELEFONO2,pEMAIL,pFECHA_NAC,pGENERO,pPROVINCIA,pCANTON,pDISTRITO,pPERTENECE_A
                    qp.AddReplaceParam("pTARJETA", tarjeta);
                    qp.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                    // Llama el procedimiento que almacena la tarjeta 
                    GUI.CApp.bll.ExecuteSql("WMS_ADocTarMisPts", qp, "PDV");
                    Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].TARJETA1 = tarjeta;
                    Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].OBSERVACIONES = nombr;
                }
                if (nombr != "")
                {
                    decimal ValRealPts = decimal.Parse(pts) / ValFactPts;
                    string ptsCols = ValRealPts.ToString();//Puntos en colones
                    if (ptsCols.IndexOf('.') > 0)
                    {
                        ptsCols = ptsCols.ToString().Substring(0, ptsCols.ToString().LastIndexOf('.'));
                    }
                    //
                    bool vEs_Credie = false;
                    CreditEko.Credie vCredie = new CreditEko.Credie();
                    string vSaldo = vCredie.mObtener_Saldo(ref vEs_Credie, tarjeta);
                    //
                    if (vEs_Credie && vSaldo != "0")
                    {
                        GUI.CApp.ShowMessage("Cliente: " + nombr + "). Disponible Credie: " + vSaldo + ". Puntos: " + pts + " (" + ptsCols + " colones)", "Mis Puntos", true);
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("Cliente: " + nombr + " Puntos: " + pts + " (" + ptsCols + " colones)", "Mis Puntos", true);
                    }
                }
                // }

                //membresia PLUS
                QueryParams vParametro = new QueryParams();
                vParametro.AddReplaceParam("pCEDULA", "");
                vParametro.AddReplaceParam("pTARJETA", tarjeta);
                string vmsj = Convert.ToString(Helpers.Nvl(GUI.CApp.bll.GetSingleValue("MSJPLUSC", vParametro, "PDV"), "-1"));

                if (vmsj != "-1")
                {//muestra el mensaje
                    GUI.CApp.ShowMessage(vmsj, "Membresia Plus", true);
                }

            }
            else
            {
                if (txtTarjet.Text == "" && txtcedula.Text != "")
                { //Busca x cédula 

                    mConsDatosCedSinWeb();
                    //nombre del cliente
                    nombr = ConsDatosCed();
                    if (tarjeta != "0")
                    {
                        //Almacena los datos en nuestra Base d Datos
                        Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                        //pTARJETA,pCEDULA,pNOMBRE,pAPELLIDO1,pAPELLIDO2,pTELEFONO1,pTELEFONO2,pEMAIL,pFECHA_NAC,pGENERO,pPROVINCIA,pCANTON,pDISTRITO,pPERTENECE_A
                        qp.AddReplaceParam("pTARJETA", tarjeta);
                        qp.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                        // Llama el procedimiento que almacena la tarjeta 
                        GUI.CApp.bll.ExecuteSql("WMS_ADocTarMisPts", qp, "PDV");
                        Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].TARJETA1 = tarjeta;
                        Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].OBSERVACIONES = nombr;
                        pts = Consultar_Puntos(tarjeta);
                    }
                    if (nombr != "")
                    {
                        decimal ValRealPts = decimal.Parse(pts) / ValFactPts;
                        string ptsCols = ValRealPts.ToString();//Puntos en colones
                        if (ptsCols.IndexOf('.') > 0)
                        {
                            ptsCols = ptsCols.ToString().Substring(0, ptsCols.ToString().LastIndexOf('.'));
                        }
                        //
                        bool vEs_Credie = false;
                        CreditEko.Credie vCredie = new CreditEko.Credie();
                        string vSaldo = vCredie.mObtener_Saldo(ref vEs_Credie, tarjeta);
                        //
                        if (vEs_Credie && vSaldo != "0")
                        {
                            //GUI.CApp.ShowMessage("Cliente: " + nombr + " Puntos: " + pts + " (" + ptsCols + " colones). Disponible Credie: " + vSaldo, "Mis Puntos", true);
                            GUI.CApp.ShowMessage("Cliente: " + nombr + "). Disponible Credie: " + vSaldo + ". Puntos: " + pts + " (" + ptsCols + " colones)", "Mis Puntos", true);
                        }
                        else
                        {
                            GUI.CApp.ShowMessage("Cliente: " + nombr + " Puntos: " + pts + " (" + ptsCols + " colones)", "Mis Puntos", true);
                        }
                    }

                    //membresia PLUS
                    QueryParams vParametro = new QueryParams();
                    vParametro.AddReplaceParam("pCEDULA", txtcedula.Text.Trim());
                    vParametro.AddReplaceParam("pTARJETA", "");
                    string vmsj = Convert.ToString(Helpers.Nvl(GUI.CApp.bll.GetSingleValue("MSJPLUSC", vParametro, "PDV"), "-1"));

                    if (vmsj != "-1")
                    {//muestra el mensaje
                        GUI.CApp.ShowMessage(vmsj, "Membresia Plus", true);
                    }
                }
            }
            this.Close();
        }



        private void frmNumTarjeta_Load(object sender, EventArgs e)
        {
            tarjeta = "0";
            LlenarParametros();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtTarjet_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnTarjeta_Click(null, null);
            }
        }

        private void btnConsCed_Click(object sender, EventArgs e)
        {
            if (GUI.CApp.ValidateAccess("Afiliacion", "Integracion Pago de Servicios"))
            {
                MainForms.Forms.MisPuntos.frmAfiliacion fafiliac = new LLNet.Tienda.MainForms.Forms.MisPuntos.frmAfiliacion();
                fafiliac.ShowDialog();
            }
        }

        #region MISPUNTOS


        private string Consultar_Puntos(string ptarjeta)
        {
            string vtarj = "";
            if (ptarjeta == "")
                vtarj = tarjeta;
            else
                vtarj = ptarjeta;

            string info = RequestPOST(varUrlPts + "consultar_puntos.php", "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + vtarj);
            string[] datos = info.Split(' ');
            if (datos.Length == 6)
            {
                string pts = datos[2].ToString();

                if (pts.LastIndexOf('.') > 0)
                {
                    pts = pts.Substring(0, pts.LastIndexOf('.'));
                }
                return pts;
            }
            else
            {
                return "0";
            }
        }

        private string ConsDatos()
        {
            string nombre = "";
            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta_informacion.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&consulta_cedula=0&numero_tarjeta=" + txtTarjet.Text;
            string info = RequestPOST(varUrlPts + "consultar_informacion.php", PData);

            info = info.Trim();
            if (info.StartsWith("<br>"))
            {
                info = info.Replace("<br>", "*");
                string[] datos = info.Split('*');

                if (datos.Length > 1)
                {
                    nombre = datos[1].ToString().Split('=').GetValue(1).ToString() + ' ' + datos[2].ToString().Split('=').GetValue(1).ToString();
                }
            }
            else
            {
                CApp.ShowMessage(info, "Tarjeta Cliente - Consulta Datos", true);
                BitacoraErrorWS("WS=" + varUrlPts + "consultar_informacion.php " + info, PData);
            }
            return nombre;
        }

        private string ConsDatosCed()
        {
            string nombre = "";
            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta_informacion.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&consulta_cedula=1&numero_tarjeta=" + txtcedula.Text;
            string info = RequestPOST(varUrlPts + "consultar_informacion.php", PData);
            info = info.Trim();

            if (info.StartsWith("<br>"))
            {
                info = info.Replace("<br>", "*");
                string[] datos = info.Split('*');
                if (datos.Length > 1)
                {
                    nombre = datos[1].ToString().Split('=').GetValue(1).ToString() + ' ' + datos[2].ToString().Split('=').GetValue(1).ToString();
                    tarjeta = datos[16].ToString().Split('=').GetValue(1).ToString();
                }
            }
            else
            {
                CApp.ShowMessage(info, "Afiliación - Consulta Datos Cédula", true);
                BitacoraErrorWS("WS=" + varUrlPts + "consultar_informacion.php " + info, PData);
            }
            return nombre;
        }

        /// <summary>Ejecuta por medio de post un llamado al Web Service utilizando HTTP POST</summary>
        /// <param name="URL"></param>
        /// <param name="PostData"></param>
        /// <returns></returns>
        private string RequestPOST(string URL, string PostData)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create(URL);
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //string postData = "";
            byte[] byteArray = Encoding.UTF8.GetBytes(PostData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            // MessageBox.Show(((HttpWebResponse)response).StatusDescription, "DESCRIPCION");
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.            
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
            return responseFromServer;
        }

        /// <summary>Obtiene los parámetros necesarios de cada tienda </summary>
        private void LlenarParametros()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_PPTS", qp);

            object[] datos = new object[3];
            datos = dsB.Tables[0].Rows[0].ItemArray;

            varUrlPts = datos[0].ToString();
            varCodemprPts = datos[1].ToString();
            varCodsucPts = datos[2].ToString();
        }

        //almacena el error en el WS
        private void BitacoraErrorWS(string pError, string pWServ)
        {
            if (pWServ.Length > 300)
                pWServ = pWServ.Substring(0, 300);
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pError", pError);
            qp.AddReplaceParam("pWServ", pWServ);
            // Llama el procedimiento que almacena el error del WS en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_BITAC_E_AFIL", qp, "PDV");
        }

        #endregion

        private void rbtnmpasaport_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtnmpasaport.Checked)
            {
                txtcedula.Mask = "";
            }
            else
            {
                txtcedula.Mask = "0-0000-0000";
            }
        }

        private void txtTarjet_TextChanged(object sender, EventArgs e)
        {
            txtcedula.Text = "";
        }

        private void txtcedula_TextChanged(object sender, EventArgs e)
        {
            txtTarjet.Text = "";
        }

        private void txtcedula_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnTarjeta_Click(null, null);
            }
        }

    }
}