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

using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;


namespace LLNet.Tienda.MainForms
{
    public partial class frm_Pago_Efectivo_Ecommerce : Form
    {
        private MainForms.Forms.frmPayments pmt;


        ////*************PRUEBAS*************//
        //string URL_PAGO_EFECTIVO_TOKEN = "https://tiendasekono.com/ws_ecommerce_test/api/v1/authenticateapi/authenticate";
        //string URL_PAGO_EFECTIVO = "https://tiendasekono.com/ws_ecommerce_test/getcashorder";
        //string Username = "WS_Ecommerce_API_TEST";
        //string Password = "EcommerceEkonoWS_2019V1_TEST";
        //JObject Json = JObject.Parse(@"{""Username"":""WS_Ecommerce_API_TEST"",""Password"":""EcommerceEkonoWS_2019V1_TEST"",""IdPais"": 0}");

        /************PRODUCCION*************
        string URL_PAGO_EFECTIVO_TOKEN = "https://tiendasekono.com/ws_ecommerce/api/v1/authenticateapi/authenticate";
        string URL_PAGO_EFECTIVO = "https://tiendasekono.com/ws_ecommerce/getcashorder";
        string Username = "WS_Ecommerce_API_PROD";
        string Password = "_WSECOM_EKONO_2019V1_PROD";
        JObject Json = JObject.Parse(@"{""Username"":""WS_Ecommerce_API_PROD"",""Password"":""_WSECOM_EKONO_2019V1_PROD"",""IdPais"": 0}");*/

        public frm_Pago_Efectivo_Ecommerce()
        {
            InitializeComponent();
            //llenarGrid(ObtenerDatosApi(ObtenerToken()));
            llenarGrid();
        }

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

        private void frm_Pago_Efectivo_Ecommerce_FormClosing(object sender, FormClosingEventArgs e)
        {

        }

        private void frm_Pago_Efectivo_Ecommerce_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F12:
                    btnPagar_Click(null, null);
                    break;
                case Keys.Escape:
                    btnSalir_Click(null, null);
                    break;
            }
        }

        private void btnPagar_Click(object sender, EventArgs e)
        {

            Pagar_Efectivo_Ecommerce();
        }

        /*#region API
        /*private string ObtenerToken()
        {
            string Token = "";
            try
            {
                var dataToSend = UTF8Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Json));

                HttpWebRequest request;
                request = WebRequest.Create(URL_PAGO_EFECTIVO_TOKEN) as HttpWebRequest;
                request.Timeout = 10 * 1000;
                request.Method = "POST";
                request.ContentLength = dataToSend.Length;
                request.ContentType = "application/json; charset=utf-8";

                //string credencilas = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(@"{""Username"":""WS_Ecommerce_API_TEST"",""Password"":""EcommerceEkonoWS_2019V1_TEST"",""IdPais"": 0}"));
                //request.Headers.Add("Authorization","Basic "+credencilas);

                request.Headers.Add("Username", Username);
                request.Headers.Add("Password", Password);

                request.Headers.Add("IdPais", "0");

                Stream postStream = request.GetRequestStream();
                postStream.Write(dataToSend, 0, dataToSend.Length);

                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                StreamReader reader = new StreamReader(response.GetResponseStream());
                Token = reader.ReadToEnd();

                //CON ESTAS 2 LINEAS LOGRAMOS ESCRIBIR EN EL LOG
                LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                EventLogManuales.WriteLog("", Convert.ToString("Token Efectivo Ecommerce " + Token));

            }
            catch (Exception ex)
            {
                LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                EventLogManuales.WriteLog("", Convert.ToString("Error ObtenerToken: " + ex));
                throw ex;
            }

            return Token;
        }

        private List<FacturaEfectivoEco> ObtenerDatosApi(string Token)
        {
            List<FacturaEfectivoEco> Lista = new List<FacturaEfectivoEco>();
            try
            {
                var Cod_Sucursal = LLNet.Tienda.MainForms.Forms.BacTasa0.Logica.GET_CG_PARAMETERS_VALUE("BREE");
                //var Cod_Sucursal = "470000000";
                var caja = Utils.Helpers.ObjToStr(Program.Caja).ToString();

                var Fecha_Inicio_DB = Convert.ToDateTime(GUI.CApp.bll.GetSingleValue("C_Fecha_Inicio_E_Eco", "PDV"));
                var Fecha_Fin_DB = Convert.ToDateTime(GUI.CApp.bll.GetSingleValue("C_Fecha_Fin_E_Eco", "PDV"));

                var Fecha_Inicial = Fecha_Inicio_DB.Date.ToString("yyyy-MM-dd");
                var Fecha_Final = Fecha_Fin_DB.Date.ToString("yyyy-MM-dd");

                JObject Json = JObject.Parse(@"{""COD_SUCURSAL"": """ + Cod_Sucursal + @""",""NUM_CAJA"":" + caja + @",""FECHA_INICIO"": """ + Fecha_Inicial + @""",""FECHA_FIN"": """ + Fecha_Final + @"""}");

                var dataToSend = UTF8Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Json));

                HttpWebRequest request;
                request = WebRequest.Create(URL_PAGO_EFECTIVO) as HttpWebRequest;
                request.Timeout = 10 * 1000;
                request.Method = "POST";
                request.ContentLength = dataToSend.Length;
                request.ContentType = "application/json; charset=utf-8";

                Token = Token.Replace('"', ' ');

                request.Headers.Add("COD_SUCURSAL", Cod_Sucursal.TrimEnd().ToString());
                //request.Headers.Add("FECHA_INICIO", "2019-01-19");
                //request.Headers.Add("FECHA_FIN", "2019-12-19");

                request.Headers.Add("FECHA_INICIO", Fecha_Inicial);
                request.Headers.Add("FECHA_FIN", Fecha_Final);

                request.Headers.Add("NUM_CAJA", caja);
                request.Headers.Add("Authorization", Token);

                Stream postStream = request.GetRequestStream();
                postStream.Write(dataToSend, 0, dataToSend.Length);

                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                StreamReader reader = new StreamReader(response.GetResponseStream());
                var ListaJson = reader.ReadToEnd();

                Lista = JsonConvert.DeserializeObject<List<FacturaEfectivoEco>>(ListaJson);


                //CON ESTAS 2 LINEAS LOGRAMOS ESCRIBIR EN EL LOG
                LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                EventLogManuales.WriteLog("", Convert.ToString("JSON Efectivo Ecommerce " + ListaJson.ToString()));

            }
            catch (Exception ex)
            {
                LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                EventLogManuales.WriteLog("", Convert.ToString("Error ObtenerDatosApi: " + ex));
                throw ex;
            }
            return Lista;
        }
        #endregion*/

        //private void llenarGrid(List<FacturaEfectivoEco> Lista)
        private void llenarGrid()
        {
            try
            {
                //                var Json = @"[{""ID_ORDEN"": 54416,
                //                                ""MONTO_ORDEN"": 17990,
                //                                ""NUM_CAJA"": 1,
                //                                ""COD_SUCURSAL"": ""470000000"",
                //                                ""NOMBRE_SUCURSAL"": ""Ekono Oxigeno"",
                //                                ""NOMBRE_CLIENTE"": ""GABRIEL IGNACIO JIMENEZ UMAÑA"",
                //                                ""IDENTIFICACION_CLIENTE"": ""1""
                //                              },
                //                              {
                //                                ""ID_ORDEN"": 54418,
                //                                ""MONTO_ORDEN"": 13990,
                //                                ""NUM_CAJA"": 3,
                //                                ""COD_SUCURSAL"": ""470000000"",
                //                                ""NOMBRE_SUCURSAL"": ""Ekono Oxigeno"",
                //                                ""NOMBRE_CLIENTE"": ""DANNA LUCIA QUIROS GUTIERREZ"",
                //                                ""IDENTIFICACION_CLIENTE"": ""1-1329-0398""
                //                              }
                //                            ]";

                gridControl1.DataSource = "";

                List<FacturaEfectivoEco> Lista1 = ObtenerOrdenesFacturar();

                //List<FacturaEfectivoEco> tabla = (List<FacturaEfectivoEco>)JsonConvert.DeserializeObject<List<FacturaEfectivoEco>>(Json);
                List<FacturaEfectivoEco> tabla = new List<FacturaEfectivoEco>();

                if (Lista1 != null)
                {
                    foreach (FacturaEfectivoEco i in Lista1)
                    {
                        if (ConsultaAnulacionRecibo(i.ID_ORDEN.ToString()))
                        {
                            tabla.Add(new FacturaEfectivoEco { ID_ORDEN = i.ID_ORDEN, MONTO_ORDEN = i.MONTO_ORDEN, NUM_CAJA = i.NUM_CAJA, COD_SUCURSAL = i.COD_SUCURSAL, NOMBRE_SUCURSAL = i.NOMBRE_SUCURSAL, NOMBRE_CLIENTE = i.NOMBRE_CLIENTE, IDENTIFICACION_CLIENTE = i.IDENTIFICACION_CLIENTE });
                        }
                    }
                    gridControl1.DataSource = tabla;
                    return;
                }
                gridControl1.DataSource = null;
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void Pagar_Efectivo_Ecommerce()
        {
            try
            {
                pmt = null;
                string monto = "";
                string no_orden = "";
                string nit = "";
                string cliente = "";
                string socio = "";
                string v_documentonc = "36";
                // string v_documentonc = GUI.CApp.GetSecuence("WMS_S_DOCUMENTO").ToString();
                Decimal vSesion = Convert.ToDecimal(GUI.CApp.GetSequence("TMP_S_SESION"));

                foreach (var row in gridView1.GetSelectedRows())
                {
                    monto = gridView1.GetRowCellValue(row, colMonto_Orden).ToString();
                    no_orden = gridView1.GetRowCellValue(row, colId_Orden).ToString();
                    nit = gridView1.GetRowCellValue(row, colIdentificacionCliente).ToString();
                    cliente = gridView1.GetRowCellValue(row, colNombreCliente).ToString();
                }

                QueryParams qp = new QueryParams();
                qp.AddReplaceParam("NIT", nit);
                socio = CApp.bll.GetSingleValue("ObtenerSocio", qp, "PDV").ToString();


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

                v_documentonc = pmt.docecom;
                //getInvoices();

                //Crea el recibo en la db
                guardaRecibo(v_documentonc,
                             no_orden,
                             GUI.CApp.usuario.ToString(),
                             cliente, nit);

                //Crea el registro en wms_pago_documentos
                guardaPagoDocumentos(v_documentonc,
                                     "36",
                                     GUI.CApp.usuario.ToString());

                //CApp.ShowMessage("Guardado con exito", "Pago Efectivo Ecommerce", true);
                //llenarGrid(ObtenerDatosApi(ObtenerToken()));
                llenarGrid();

            }
            catch (Exception ex)
            {
                CApp.ShowMessage("A ocurrido un error, favor reportarlo al departamento de soporte" + ex, "Error al procesar", true);
                //CON ESTAS 2 LINEAS LOGRAMOS ESCRIBIR EN EL LOG
                LLNet.Controls.LLEventLog EventLogManuales = new LLNet.Controls.LLEventLog(LLNet.DAL.OracleDAL.ExeLogDir);
                EventLogManuales.WriteLog("", Convert.ToString("A ocurrido un error, favor reportarlo al departamento de soporte " + ex));
            }
        }

        private bool ConsultaAnulacionRecibo(string no_orden)
        {
            try
            {
                QueryParams param1 = new QueryParams();
                param1.Clear();
                param1.AddReplaceParam("FACTURA_PROVEEDOR", no_orden);

                var result = GUI.CApp.bll.getDataSet("PDV", "C_Rec_Anulado", param1);
                if (result.Tables[0].Rows.Count > 0)
                {
                    var ANULADA_POR = result.Tables[0].Rows[0]["ANULADA_POR"].ToString();
                    var ANULADA_EL = result.Tables[0].Rows[0]["ANULADA_EL"].ToString();
                    var TIPO_DOCUMENTO = result.Tables[0].Rows[0]["TIPO_DOCUMENTO"].ToString();

                    if (!String.IsNullOrEmpty(TIPO_DOCUMENTO))
                    {
                        if (!String.IsNullOrEmpty(ANULADA_POR) || !String.IsNullOrEmpty(ANULADA_EL))
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
                else { return true; }
            }
            catch (Exception ex)
            {
                return false;
                throw ex;
            }
        }

        private void guardaRecibo(string documento, string no_orden, string creado_por, string cliente, string nit)
        {
            try
            {
                QueryParams param1 = new QueryParams();
                param1.Clear();
                param1.AddReplaceParam("DOCUMENTO", documento);
                param1.AddReplaceParam("NIT", nit);
                param1.AddReplaceParam("FACTURA_PROVEEDOR", no_orden);
                param1.AddReplaceParam("CLIENTE", cliente);
                param1.AddReplaceParam("USUARIO1", creado_por);

                CApp.bll.ExecuteSql("GrabaRecibo", param1, "PDV");
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        private void guardaPagoDocumentos(string documento, string tipo_pago, string creado_por)
        {
            try
            {
                QueryParams param = new QueryParams();
                param.Clear();
                param.AddReplaceParam("DOCUMENTO", documento);
                param.AddReplaceParam("TIPO_PAGO", tipo_pago);
                param.AddReplaceParam("CREADO_POR", creado_por);

                CApp.bll.ExecuteSql("Graba_Pago_Documentos", param, "PDV");
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        
        private List<FacturaEfectivoEco> ObtenerOrdenesFacturar()
        {
            try
            {
                var cod_Sucursal = LLNet.Tienda.MainForms.Forms.BacTasa0.Logica.GET_CG_PARAMETERS_VALUE("BREE");
                var caja = Utils.Helpers.ObjToStr(Program.Caja).ToString();

                QueryParams parameters = new QueryParams();
                parameters.Clear();
                parameters.AddReplaceParam("COD_SUCURSAL", cod_Sucursal.TrimEnd().ToString());
                parameters.AddReplaceParam("CAJA", caja.TrimEnd().ToString());

                DataSet vDataSet = CApp.bll.getDataSet("PDV", "Obt_Ordenes_efectivo_ecom_x_caja", parameters);
                if (vDataSet.Tables.Count > 0)
                {
                    var vJson = JsonConvert.SerializeObject(vDataSet.Tables[0]);
                    return JsonConvert.DeserializeObject<List<FacturaEfectivoEco>>(vJson);
                }
                else
                {
                    return null;
                }
                
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }
}

public class FacturaEfectivoEco
{
    public FacturaEfectivoEco() { }

    public string ID_ORDEN { get; set; }
    public decimal MONTO_ORDEN { get; set; }
    public int NUM_CAJA { get; set; }
    public int COD_SUCURSAL { get; set; }
    public string NOMBRE_SUCURSAL { get; set; }
    public string NOMBRE_CLIENTE { get; set; }
    public string IDENTIFICACION_CLIENTE { get; set; }

}