using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class frmCombos : LLNet.GUI.FormBases.frmBase
    {
        private string unidadGlobal;
        private decimal factorUnidadGlobal;

        private decimal? linea;

        public frmCombos()
        {
            InitializeComponent();

            GUI.CApp.TraducirForm(this);
        }

        public override void Init(object[] pArgs)
        {
            base.Init(pArgs);
            if (pArgs != null)
            {
                dsPDV1 = pArgs[0] as Model.PDV.DsPDV;
                linea = Convert.ToDecimal(pArgs[1]);
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());
                qp.AddReplaceParam("LINEA", linea.ToString());
                unidadGlobal = Utils.Helpers.ObjToStr(GUI.CApp.bll.GetSingleValue("UnidadInventarioCombo", qp, "PDV"));

                gridControl1.DataSource = dsPDV1;
                gridControl1.DataMember = dsPDV1.COMBOS.TableName;
                gridView1.BestFitColumns();
                gridView1.ExpandAllGroups();

                qp.Clear();
                qp.AddReplaceParam("RV_DOMAIN", "UNIDAD INVENTARIO");
                dsGeneral1.CG_REF_CODES.Clear();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsGeneral1.GetType(), dsGeneral1.CG_REF_CODES.TableName, qp), dsGeneral1);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            gridView1.PostEditor();
            gridView1.UpdateCurrentRow();
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                int rowHandle = gridView1.GetRowHandle(i);
                object cant = gridView1.GetRowCellValue(rowHandle, colCANTIDAD_REAL);
                if (cant != null && cant != DBNull.Value)
                {
                    decimal dCant = Convert.ToDecimal(cant);
                    if (dCant > 0)
                    {
                        Program.FrmMainPos.pos.ctlAddSkus1.LineaPadre = linea;
                        Program.FrmMainPos.pos.ctlAddSkus1.InsertOrderLine(
                            gridView1.GetRowCellValue(rowHandle, colSKU_ALTERNO).ToString(), dCant,GUI.CApp.usuario, 0, 0, null, null, null);
                    }
                }
            }

            Program.FrmMainPos.RefreshData();
            DialogResult = DialogResult.OK;
        }

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

        private void gridView1_Click(object sender, EventArgs e)
        {
            if (Utils.Helpers.ObjToStr(gridView1.GetFocusedRowCellValue(colCANTIDAD_REAL)) == string.Empty)
            {
                decimal cantidadRestante = CantidadRestante(gridView1.GetFocusedRowCellValue(colCLASIFICACION),0);
                decimal cantidadSugerida = Convert.ToDecimal(Utils.Helpers.Nvl(gridView1.GetFocusedRowCellValue(colCANTIDAD_SUGERIDA), 1));
                if ((cantidadRestante > 0 && cantidadRestante >= cantidadSugerida) || cantidadRestante == -1)
                    gridView1.SetFocusedRowCellValue(colCANTIDAD_REAL, cantidadSugerida);
                else
                    GUI.CApp.ShowMessage("Ya ha seleccionado la cantidad máxima de opciones", "Combos", true);
            }
            else
            {
                gridView1.SetFocusedRowCellValue(colCANTIDAD_REAL, null);
                gridView1.SetFocusedRowCellValue(colCONTENIDO, null);
            }

            gridView1.PostEditor();
            gridView1.UpdateCurrentRow();            
        }

        private decimal CantidadRestante(object pClasificacion, decimal oldValue)
        {
            if (pClasificacion != null)
            {
                DataRow[] dr = dsPDV1.COMBOS.Select("Clasificacion = " + pClasificacion.ToString());
                if (dr.Length > 0)
                {
                    object oCant = dr[0]["CANTIDAD"];
                    if (oCant == null || oCant == DBNull.Value)
                        return -1;
                    else
                    {
                        decimal dCant = 0;
                        foreach (DataRow dRow in dr)
                        {
                            if (dRow["CANTIDAD_REAL"] != DBNull.Value)
                                dCant += Convert.ToDecimal(dRow["CANTIDAD_REAL"]) * Convert.ToDecimal(dRow["FACTOR"]);
                        }
                        return Convert.ToDecimal(oCant) - dCant + oldValue;
                    }
                }
                else
                    return 0;
            }
            else
                return 0;
        }

        private void gridView1_CustomRowCellEditForEditing(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
        {
            switch (e.Column.Name)
            {
                case "colUNIDAD_SELECCIONADA":
                    e.RepositoryItem = lueUnidadInventario;
                    break;
            }
        }

        private void gridView1_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
        {
        }

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            if (gridView1.GetRowCellValue(e.FocusedRowHandle, colUNIDAD_INVENTARIO) != null)
            {
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("UNIDAD", gridView1.GetRowCellValue(e.FocusedRowHandle, colUNIDAD_INVENTARIO).ToString());
                dsPDV1.UNIDADES_INVENTARIO.Clear();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsPDV1.GetType(), dsPDV1.UNIDADES_INVENTARIO.TableName, qp), dsPDV1);
                lueUnidadInventario.DataSource = dsPDV1.UNIDADES_INVENTARIO;
            }
        }

        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
        }

        private void lueUnidadInventario_EditValueChanged(object sender, EventArgs e)
        {
            object factor = ((DevExpress.XtraEditors.LookUpEdit)sender).GetColumnValue("FACTOR");
            gridView1.SetFocusedRowCellValue(colFACTOR_LINEA, factor);
            object cantidad = gridView1.GetFocusedRowCellValue(colCONTENIDO);
            if (factor != null && cantidad != DBNull.Value)
            {
                gridView1.SetFocusedRowCellValue(colCANTIDAD_REAL, null);
                gridView1.SetFocusedRowCellValue(colCONTENIDO, null);
            }
        }

        private void calcContenido_EditValueChanged(object sender, EventArgs e)
        {
            object factor = gridView1.GetFocusedRowCellValue(colFACTOR_LINEA);
            object cantidad = ((DevExpress.XtraEditors.CalcEdit)sender).EditValue;
            if (factor == DBNull.Value || factor == null) factor = 1;
            if (cantidad != DBNull.Value)
                gridView1.SetFocusedRowCellValue(colCANTIDAD_REAL, Convert.ToDecimal(cantidad) / Convert.ToDecimal(factor) );
        }

        private void calcContenido_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
        {
            if (Utils.Helpers.ObjToStr(e.NewValue) != string.Empty)
            {
                object factor = gridView1.GetFocusedRowCellValue(colFACTOR_LINEA);
                if (factor == DBNull.Value || factor == null) factor = 1;

                decimal cantidadRestante = CantidadRestante(gridView1.GetFocusedRowCellValue(colCLASIFICACION), Convert.ToDecimal(Utils.Helpers.Nvl(e.OldValue, 0)) / Convert.ToDecimal(factor) * Convert.ToDecimal(gridView1.GetFocusedRowCellValue(colFACTOR)));
                decimal cantidadSugerida = Convert.ToDecimal(e.NewValue) / Convert.ToDecimal(factor) * Convert.ToDecimal(gridView1.GetFocusedRowCellValue(colFACTOR));
                if ((cantidadRestante > 0 && cantidadRestante >= cantidadSugerida) || cantidadRestante == -1)
                {
                }
                else
                {
                    GUI.CApp.ShowMessage("Ya ha seleccionado la cantidad máxima de opciones", "Combos", true);
                    e.Cancel = true;
                }
            }
            else
            {
                gridView1.SetFocusedRowCellValue(colCANTIDAD_REAL, null);
                gridView1.SetFocusedRowCellValue(colCONTENIDO, null);
            }
        }

        private void lueUnidades_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
        {
        }
    }
}