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;

namespace LLNet.Tienda.MainForms.Forms.Zunify
{
    public partial class frmZunify : Form
    {
        private ZunifyUtils zunify;
        private decimal Amount;
        private string Currency;
        private string TerminalCode;
        private byte[] TerminalCodeQR;
        private string ChargeCode;
        private string URLWebhook;
        private string TOKENWebhook;
        private Controls.ctlZunify zuni;

        public frmZunify(Controls.ctlZunify zuni, string documento)
        {
            this.zuni = zuni;
            zunify = new ZunifyUtils(documento);
            InitializeComponent();      
            this.Currency = "CRC";
            this.Amount = Convert.ToDecimal(zuni.rowMONTO.Properties.Value);
            this.txtMonto.Text = "₡ " + Convert.ToDecimal(zuni.rowMONTO.Properties.Value);
            this.URLWebhook = BacTasa0.Logica.GET_CG_PARAMETERS_VALUE("ZWHU");
            this.TOKENWebhook = BacTasa0.Logica.GET_CG_PARAMETERS_VALUE("ZWHT");
            
        }


        private void btnAnular_Click(object sender, EventArgs e)
        {
            bool result = zunify.DeleteCharge();
            if (result)
            {
                this.panelInicio.Visible = true;
                this.panelCargo.Visible = false;
            }
            else
            {
                MessageBox.Show("No se pudo anular el cargo: /n" + zunify.Get_ErrorMessage(), "Error " + zunify.Get_ErrorCode());
            }
        }

        private void btnVerificar_Click(object sender, EventArgs e)
        {
            bool result = zunify.GetCharge();
            if (result)
            {
                switch (zunify.Get_Status()){
                    case "Pending":
                        MessageBox.Show("El cargo se encuentra Pendiente", "Verificar Cargo");
                        break;
                    case "Paid":                        
                        zuni.AgregarPago(null, Convert.ToDecimal(zuni.rowMONTO.Properties.Value));
                        this.panelInicio.Visible = false;
                        this.panelCargo.Visible = false;
                        this.panelSalir.Visible = true;

                        break;
                    case "Cancelled":
                        MessageBox.Show("El cargo se encuentra Cancelado", "Verificar Cargo");
                        this.panelInicio.Visible = true;
                        this.panelCargo.Visible = false;
                        break;
                    case "Expired":
                        MessageBox.Show("El cargo se encuentra Expirado", "Verificar Cargo");
                        this.panelInicio.Visible = true;
                        this.panelCargo.Visible = false;
                        break;
                    default:
                            MessageBox.Show("Estado del cargo: " + zunify.Get_Status() + "Tomar nota del siguiente código: " + zunify.Get_ChargeCode(), "Error");
                        break;
                }                
            }
            else
            {
                MessageBox.Show("Estado del Cargo: " + zunify.Get_Status(), "Verificar Cargo");
            }
        }

        private void btnCrearCargo_Click(object sender, EventArgs e)
        {
            bool result = zunify.CreateCharge(this.Amount);
            if (result)
            {                
                byte[] bytes = this.TerminalCodeQR;
                if (bytes != null) {
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes))
                    {
                        this.imgQRTerminal.Image = Image.FromStream(ms);
                    }
                }

                this.panelInicio.Visible = false;
                this.panelCargo.Visible = true;
            }
            else {
                MessageBox.Show("No se pudo crear el cargo: " + zunify.Get_ErrorMessage(),"Error " + zunify.Get_ErrorCode());
            }
        }

        private void btnVerCargos_Click(object sender, EventArgs e)
        {
            this.tableListaCodCargos.DataSource = null;
            this.panelListaCargos.Visible = true;
            this.panelInicio.Visible = false;
            DataSet datos = zunify.Get_ZunifyTranList();
            this.tableListaCodCargos.DataSource = datos.Tables[0];
            this.tableListaCodCargos.Refresh();

            

        }

        private void btnCancelarCargo_Click(object sender, EventArgs e)
        {    
            this.Dispose();
        }

        /// Getters and Setters
        /// 
        public void Set_TerminalCode(string TerminalCode) {
            this.TerminalCode = TerminalCode;
        }
        public bool TestAPI() {
            bool result = zunify.SetWebhook(this.URLWebhook, this.TOKENWebhook);
            if (!result) {
                MessageBox.Show("Estado del API: " + zunify.Get_ErrorMessage(), "Error: " + zunify.Get_ErrorCode());
            }
            return result;
        }

       

        private void btnRetroceder_Click(object sender, EventArgs e)
        {
            this.panelListaCargos.Visible = false;
            this.panelInicio.Visible = true;
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {

            this.Dispose();
        }

        private void tableListaCodCargos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                string id = this.tableListaCodCargos.SelectedRows[0].Cells[0].Value.ToString();
                string estado = this.tableListaCodCargos.SelectedRows[0].Cells[1].Value.ToString();
                string monto = this.tableListaCodCargos.SelectedRows[0].Cells[2].Value.ToString();
                string cargo = this.tableListaCodCargos.SelectedRows[0].Cells[3].Value.ToString();
                string moneda = this.tableListaCodCargos.SelectedRows[0].Cells[4].Value.ToString();
                string terminal = this.tableListaCodCargos.SelectedRows[0].Cells[5].Value.ToString();
                string documento = this.tableListaCodCargos.SelectedRows[0].Cells[6].Value.ToString();
                bool result = zunify.Change_ZunifyWMSDocument(cargo, documento, estado);
                if (result)
                {
                    zuni.AgregarPago(null, Convert.ToDecimal(monto));
                    this.Dispose();
                }
                else {
                    MessageBox.Show("Este código de cargo ya se encuentra asociado a una factura", "Atención");
                }
            }
            catch (Exception)
            {
                return;
            }
        }
    }
}
