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

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class frmPagoCredito : LLNet.GUI.FormBases.frmBase
    {
        public frmPagoCredito()
        {
            InitializeComponent();

            GUI.CApp.TraducirForm(this);
        }

        private decimal socio;
        private string oldNit;

        private void gridControl1_Click(object sender, EventArgs e)
        {
        }

        private void buttonEdit2_EditValueChanged(object sender, EventArgs e)
        {
        }

        public override void Init(object[] pArgs)
        {
            base.Init(pArgs);
            dsPDV1.TDA_V_FACTURAS_CREDITO.Clear();
            beNIT.EditValue = null;
            beCliente.EditValue = null;
            txtMonto.EditValue = null;
        }

        private void getInvoices()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam(Utils.QueryParams.PredefinedTags.AllToolbarsTag, " AND SOCIO = " + socio.ToString() );
           // qp.AddReplaceParam("SOCIO", socio.ToString());
            dsPDV1.TDA_V_FACTURAS_CREDITO.Clear();
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.TDA_V_FACTURAS_CREDITO.TableName, qp), dsPDV1);
            decimal total = 0;
            foreach (Model.PDV.DsPDV.TDA_V_FACTURAS_CREDITORow row in dsPDV1.TDA_V_FACTURAS_CREDITO)
            {
                total += row.SALDO;
            }
            gridView1.SelectAll();
            txtMonto.EditValue = Math.Round(total,2);
        }

        private void beNIT_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            Tienda.MainForms.Finders.frmFindCustomer fc = new LLNet.Tienda.MainForms.Finders.frmFindCustomer();
            fc.Init(null);
            fc.ShowDialog(this);

            if (fc.DialogResult == DialogResult.OK)
            {
                socio = Convert.ToDecimal(fc.Socio);
                beNIT.EditValue = fc.NIT;
                beCliente.EditValue = fc.Nombre;
                oldNit = fc.NIT;
                getInvoices();
                txtMonto.Focus();
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Program.CloseWindow(this);
        }

        private void frmPagoCredito_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            { 
                case Keys.Escape:
                    btnCancelar_Click(null, null);
                    break;
                case Keys.F2:
                    btnBuscar_Click(null, null);
                    break;
                case Keys.F3:
                    btnCalculate_Click(null, null);
                    break;
                case Keys.F12:
                    btnAceptar_Click(null, null);
                    break;
            }
        }

        private MainForms.Forms.frmPayments pmt;

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            decimal saldo, saldoSeleccionado = 0;
            v_documento = null;

            foreach (int handle in gridView1.GetSelectedRows())
            {

          
                
                // SLA_005, edited by ECM. 

                // Variable que recibe dos resultados '1' del apartado en selecciòn = se encuentra vencido, '0' = esta en el periodo.
                int vencimiento;
  
                if(Convert.ToString(gridView1.GetRowCellValue(handle, colTIPO))== "APARTADO")

                {

                QueryParams consult_a_vencidos = new QueryParams();
                consult_a_vencidos.AddReplaceParam("DOCUMENTO", gridView1.GetRowCellValue(handle, colDOCUMENTO).ToString());
                CApp.bll.ExecuteSql("consulta_Apartados_Vencidos", consult_a_vencidos, "PDV");

                vencimiento  = Convert.ToInt16 ( Utils.Helpers.ObjToStr(GUI.CApp.bll.GetSingleValue("consulta_Apartados_Vencidos", consult_a_vencidos, "PDV")));
           

                    if (vencimiento == 1) 
                    {

                        string serie;
                        string documento;
                        string cadena;

                        serie = gridView1.GetRowCellValue(handle, colSERIE).ToString();
                        documento = gridView1.GetRowCellValue(handle, colDOCUMENTO).ToString();

                        cadena = serie + "-" + documento;


                        GUI.CApp.ShowMessage("El Apartado " + cadena + " se encuentra vencido y no puede ser abonado", "Error en cobro del Apartado", true);
                        return;

                    }

                    else {

                        goto R_POINT_3;


                    }  

                }

                else 
                {
                    goto R_POINT_3;

                }

                //END OF SLA_005

                R_POINT_3:

                saldo = Convert.ToDecimal(gridView1.GetRowCellValue(handle, colSALDO));
                saldoSeleccionado += saldo;
                v_documento += gridView1.GetRowCellValue(handle, colDOCUMENTO).ToString() + ",";
                              
            }

            v_documento = v_documento.Substring(0, v_documento.Length - 1);

            if (Convert.ToDecimal(txtMonto.EditValue) > saldoSeleccionado)
            {
                GUI.CApp.ShowMessage("El monto no puede ser mayor al saldo total de las facturas seleccionadas", "Cobro de Facturas al Crédito", true);
                txtMonto.EditValue = saldoSeleccionado;
                return;
            }

            Decimal vSesion = Convert.ToDecimal(GUI.CApp.GetSequence("TMP_S_SESION"));

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("SESION", vSesion.ToString());
            GUI.CApp.bll.ExecuteSql("DeleteTempDocSession", qp, "PDV");

            foreach (int handle in gridView1.GetSelectedRows())
            {
                qp.Clear();
                qp.AddReplaceParam("SESION", vSesion.ToString());
                qp.AddReplaceParam("DOCUMENTO", gridView1.GetRowCellValue(handle, colDOCUMENTO).ToString());
                GUI.CApp.bll.ExecuteSql("InsertTempDocument", qp, "PDV");
            }           

            if (pmt == null)
                pmt = new LLNet.Tienda.MainForms.Forms.frmPayments();
            pmt.Init(new object[] { socio, txtMonto.EditValue, false, vSesion,v_documento});
            pmt.ShowDialog(this);
            getInvoices();

            //#region MISPUNTOS
            
            ////Consulta el saldo del apartado y el # de tarjeta
            //Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
            //qp2.AddReplaceParam("pDocumento", v_documento);
            //DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "SaldyTarjPts", qp2);
            ////Si el saldo es 0 y tiene tarjeta asignada otorga PTS
            //if (dsB.Tables.Count > 0)
            //{
            //    if (dsB.Tables[0].Rows.Count > 0)
            //    {
            //        object[] datos = new object[4];
            //        datos = dsB.Tables[0].Rows[0].ItemArray;                   
            //        //Si el saldo es 0 , tiene tarjeta asignada Y NO SE LE HAN DADO PUNTOS X ESTA COMPRA

            //        MessageBox.Show("DATOS" + datos[1].ToString());
            //        if ((datos[0].ToString() == "0") && (datos[1].ToString() != "-1") && (datos[3].ToString() == "-1"))
            //        {
            //            //Envia los datos de la compra al proveedor para que acumule los puntos
            //            string PData = "url_respuesta=" + varUrlPts + "ws_prueba_resp_carga_transaccion_detalle.php&tipo_respuesta=1&cod_empresa=" + varUrlPts + "&cod_sucursal=" + varUrlPts + "&numero_tarjeta=" + datos[1].ToString() + "&numero_factura=" + v_documento;
            //            PData += "&nombre_cajero=" + CApp.usuario + MisPuntos(v_documento);
            //            string info = RequestPOST("http://www.mispuntoscr.com/desarrollo/ws_carga_transaccion_detalle.php", PData);
            //            string[] datos2 = info.Split('=');
            //            if (datos2.Length == 2)
            //            {
            //                if (datos2[0].ToString().StartsWith("10"))
            //                {
            //                    //Almacena los puntos en nuestra Base d Datos
            //                    Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
            //                    qp3.AddReplaceParam("pDOCUMENTO", v_documento);
            //                    qp3.AddReplaceParam("pPTSGANA", datos2[1].ToString());
            //                    GUI.CApp.bll.ExecuteSql("WMS_IPtsFACTURA", qp3, "PDV");
            //                }
            //                else
            //                {
            //                    CApp.ShowMessage(info, "Acumular Puntos", true);
            //                }
            //            }
            //        }
            //    }
            //}       


            //#endregion
        }

        private void frmPagoCredito_Load(object sender, EventArgs e)
        {
        }

        private void frmPagoCredito_Shown(object sender, EventArgs e)
        {
            layoutControl1.Focus();
            layoutControl1.FocusHelper.FocusFirst();
        }

        private void beNIT_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                if (e.KeyCode == Keys.Enter)
            {
                Model.PDV.DsPDV.WMS_SOCIOSRow cust = GetCustomer(Utils.Helpers.ObjToStr(((DevExpress.XtraEditors.ButtonEdit)sender).EditValue));
                if (cust != null)
                {
                    socio = cust.SOCIO;
                    beNIT.EditValue = cust.NIT;
                    beCliente.EditValue = cust.NOMBRE;
                    oldNit = cust.NIT;
                    getInvoices();
                    txtMonto.Focus();
                }
                else
                {
                    oldNit = null;
                    socio = 0;
                    beCliente.EditValue = null;
                    dsPDV1.TDA_V_FACTURAS_CREDITO.Clear();
                    beCliente.EditValue = "Cliente no existe";
                    beNIT.SelectAll();
                    beNIT.Focus();
                }
            }
        }


        public Model.PDV.DsPDV.WMS_SOCIOSRow GetCustomer(string NIT)
        {

            Utils.QueryParams qp = new Utils.QueryParams();

            if (NIT == oldNit && dsPDV1.WMS_SOCIOS.Count > 0 && NIT != string.Empty)
                return dsPDV1.WMS_SOCIOS[0];
            dsPDV1.WMS_SOCIOS.Clear();

            // Si no ingresaron codigo devuelve el consumidor final
            if ((NIT == null) || (NIT == ""))
            {
                return null;
            }
            else
            {
                qp.AddReplaceParam("NIT", NIT);

                // Busca el NIT ingresado
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.WMS_SOCIOS.TableName, qp, "CustomerByNIT"), dsPDV1);
                if (dsPDV1.WMS_SOCIOS.Rows.Count == 0)
                {
                    return null;
                }
            }
            oldNit = NIT;

            return dsPDV1.WMS_SOCIOS[0];
        }
        
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            beNIT_ButtonClick(null, null);
        }

        private void btnCalculate_Click(object sender, EventArgs e)
        {
            decimal saldo, saldoSeleccionado = 0;

            foreach (int handle in gridView1.GetSelectedRows())
            {
                saldo = Convert.ToDecimal(gridView1.GetRowCellValue(handle, colSALDO));
                saldoSeleccionado += saldo;
            }

            txtMonto.EditValue = saldoSeleccionado;
           
        }

        private void label1_Click(object sender, EventArgs e)
        {


        }

        #region MIS PUNTOS

        /// <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.
            MessageBox.Show(responseFromServer, "Respuesta del Server");
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
            return responseFromServer;
        }

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

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

            if (dsB.Tables.Count > 0)
            {
                int cont = 0;
                foreach (DataRow Fila in dsB.Tables[0].Rows)
                {//Productos

                    //Fila = dsB.Tables[0].Rows[cont];                                                          
                    matrizP += "&producto[" + cont + "][codigo]=" + Convert.ToString(Fila[0]); //codigo
                    matrizP += "&producto[" + cont + "][descripcion]=" + Convert.ToString(Fila[1]); //descripcion
                    matrizP += "&producto[" + cont + "][categoria]=" + Convert.ToString(Fila[2]); //categoria
                    matrizP += "&producto[" + cont + "][monto]=" + Convert.ToString(Fila[3]); //monto

                    //&producto[0][codigo]=JW&producto[0][descripcion]=Jonny+Walker&producto[0][categoria]=Botella&producto[0][monto]=25000

                    cont += 1;
                }
            }
            return matrizP;
        }

        #endregion
    }
}