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.Text.RegularExpressions;
using System.Net;
using System.IO;

namespace LLNet.Tienda
{
    public partial class Frm_Fe_Proveedor_Compra : Form
    {
        Regex vExpresion_Email = new Regex(@"^[^@]+@[^@]+\.[a-zA-Z]{2,}$");//Expresion regular para el correo
        Regex vExpresion_Ced = new Regex(@"^\d-\d{4,4}-\d{4,4}$");//Expresión regular para el número de cédula
        Regex vExpresion_Jud = new Regex(@"[0-9]{10}");//Expresión regular para el número de cédula
        Regex vExpresion_Ext = new Regex(@"[0-9]{12}");//Expresión regular para el número de cédula

        public Frm_Fe_Proveedor_Compra()
        {
            InitializeComponent();
        }
        #region Metodos

        #region mTiposIdentificacion
        /// <summary>
        /// Este método obtiene y carga en el combobox los tipos de identicación
        /// </summary>
        private void mTiposIdentificacion()
        {
            cbxTipoID.DataSource = null;
            cbxTipoID.SelectedValueChanged -= cbxTipoID_SelectedValueChanged;

            using (DataSet vTipoIdentif = CApp.bll.getDataSet("PDV", "FE_V_TIPO_IDENTIFICACION"))
            {
                // Verifica si tiene datos
                if (vTipoIdentif.Tables.Count > 0 && vTipoIdentif.Tables[0].Rows.Count > 0)
                {
                    cbxTipoID.DataSource = vTipoIdentif.Tables[0];
                    cbxTipoID.DisplayMember = "TIPO";
                    cbxTipoID.ValueMember = "ID_TIPO";
                }
            }

            cbxTipoID.SelectedValueChanged += cbxTipoID_SelectedValueChanged;
        }
        #endregion

        #region Frm_keydown
        private void Frm_Fe_Proveedor_Compra_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.None)
            {
                switch (e.KeyCode)
                {
                    case Keys.F12:
                        btn_Guardar_Click(null, null);
                        break;
                    case Keys.Escape:
                        btn_Cerrar_Click(null, null);
                        break;
                }
            }
        }
        #endregion

        #region Limpiar
        private void Limpiar()
        {
            cbxTipoID.SelectedIndex = 0;
            mtbIdentificacion.Text = null;
            txt_Nombre.Text = null;
            cbx_Provincia.SelectedIndex = 0;
            cbx_Canton.SelectedIndex = 0;
            cbx_Distrito.SelectedIndex = 0;
            cbx_Barrio.SelectedIndex = 0;
            txt_Direccion.Text = null;
            txt_Email.Text = null;
            txt_Telefono.Text = null;
        }
        #endregion

        #region mCantones
        /// <summary>
        /// Obtiene y carga los cantones
        /// </summary>
        private void mCantones()
        {
            cbx_Canton.DataSource = null;

            QueryParams vParametro = new QueryParams();
            vParametro.AddReplaceParam("pPROVINCIA", cbx_Provincia.Text);

            using (DataSet vCantones = CApp.bll.getDataSet("PDV", "FE_CANTONES", vParametro))
            {
                // Verifica si tiene datos
                if (vCantones.Tables.Count > 0 && vCantones.Tables[0].Rows.Count > 0)
                {
                    cbx_Canton.DataSource = vCantones.Tables[0];
                    cbx_Canton.DisplayMember = "CANTON";
                    cbx_Canton.ValueMember = "IDCANTON";
                }
            }
        }
        #endregion

        #region mDistritos
        /// <summary>
        /// Obtiene y carga los Distritos
        /// </summary>
        private void mDistritos()
        {
            cbx_Distrito.DataSource = null;

            QueryParams vParametro = new QueryParams();
            vParametro.AddReplaceParam("pPROVINCIA", cbx_Provincia.Text);
            vParametro.AddReplaceParam("pCANTON", cbx_Canton.Text);

            using (DataSet vDistritos = CApp.bll.getDataSet("PDV", "FE_DISTRITOS", vParametro))
            {
                // Verifica si tiene datos
                if (vDistritos.Tables.Count > 0 && vDistritos.Tables[0].Rows.Count > 0)
                {
                    cbx_Distrito.DataSource = vDistritos.Tables[0];
                    cbx_Distrito.DisplayMember = "DISTRITO";
                    cbx_Distrito.ValueMember = "IDDISTRITO";
                }
            }
        }
        #endregion

        #region mBarrios
        /// <summary>
        /// Obtiene y carga los Barrios
        /// </summary>
        private void mBarrios()
        {
            cbx_Barrio.DataSource = null;

            QueryParams vParametro = new QueryParams();
            vParametro.AddReplaceParam("pPROVINCIA", cbx_Provincia.Text);
            vParametro.AddReplaceParam("pCANTON", cbx_Canton.Text);
            vParametro.AddReplaceParam("pDISTRITO", cbx_Distrito.Text);

            using (DataSet vBarrios = CApp.bll.getDataSet("PDV", "FE_BARRIOS", vParametro))
            {
                // Verifica si tiene datos
                if (vBarrios.Tables.Count > 0 && vBarrios.Tables[0].Rows.Count > 0)
                {
                    cbx_Barrio.DataSource = vBarrios.Tables[0];
                    cbx_Barrio.DisplayMember = "BARRIO";
                    cbx_Barrio.ValueMember = "IDBARRIO";
                }
            }
        }
        #endregion

        #region mProvincias
        /// <summary>
        /// Obtiene y carga las provincias
        /// </summary>
        private void mProvincias()
        {
            cbx_Provincia.DataSource = null;
            cbx_Provincia.SelectedIndexChanged -= cbx_Provincia_SelectedIndexChanged;

            using (DataSet vProvincias = CApp.bll.getDataSet("PDV", "FE_PROVINCIAS"))
            {
                // Verifica si tiene datos
                if (vProvincias.Tables.Count > 0 && vProvincias.Tables[0].Rows.Count > 0)
                {
                    cbx_Provincia.DataSource = vProvincias.Tables[0];
                    cbx_Provincia.DisplayMember = "PROVINCIA";
                    cbx_Provincia.ValueMember = "IDPROV";
                }
            }

            cbx_Provincia.SelectedIndexChanged += cbx_Provincia_SelectedIndexChanged;
        }
        #endregion


        #endregion

        #region Acciones

        #region Ubicacion
        private void cbx_Provincia_SelectedValueChanged(object sender, EventArgs e)
        {
            cbx_Canton.DataSource = null;
            cbx_Canton.Items.Clear();
            Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
            qp2.AddReplaceParam("pPROVINCIA", cbx_Provincia.Text);
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "CANTONES", qp2);
            if (dsB.Tables.Count > 0)
            {
                if (dsB.Tables[0].Rows.Count > 0)
                {
                    cbx_Canton.DataSource = dsB.Tables[0].DefaultView;
                    cbx_Canton.DisplayMember = "CANTON";
                }
            }
        }

        private void cBx_Canton_SelectedValueChanged(object sender, EventArgs e)
        {
            cbx_Distrito.DataSource = null;
            cbx_Distrito.Items.Clear();
            Utils.QueryParams qp2 = new LLNet.Utils.QueryParams();
            qp2.AddReplaceParam("pPROVINCIA", cbx_Provincia.Text);
            qp2.AddReplaceParam("pCANTON", cbx_Canton.Text);
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "DISTRITOS", qp2);
            if (dsB.Tables.Count > 0)
            {
                if (dsB.Tables[0].Rows.Count > 0)
                {
                    cbx_Distrito.DataSource = dsB.Tables[0].DefaultView;
                    cbx_Distrito.DisplayMember = "DISTRITO";
                }
            }
        }

        #endregion

        #region CbxTipoID

        private void cbxTipoID_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cbxTipoID.SelectedValue.ToString() == "01")
                {
                    mtbIdentificacion.Mask = "0-0000-0000";
                    mtbIdentificacion.Focus();
                }
                else
                {
                    mtbIdentificacion.Mask = String.Empty;
                    mtbIdentificacion.Focus();
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Factura de Compras", true);
            }
        }

        #endregion

        #region Frm_Proveerdor_compra
        private void Frm_Fe_Proveedor_Compra_Load(object sender, EventArgs e)
        {
            mTiposIdentificacion();
            mProvincias();
            cbxTipoID_SelectedValueChanged(null, null);
        }
        #endregion 

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


        private void btn_Guardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (cbxTipoID.SelectedValue.ToString() == "01" && !vExpresion_Ced.IsMatch(mtbIdentificacion.Text))
                {
                    CApp.ShowMessage("¡Digite/complete la cédula con el formato 0-0000-0000!", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                else if (cbxTipoID.SelectedValue.ToString() == "02" && (!vExpresion_Jud.IsMatch(mtbIdentificacion.Text) || mtbIdentificacion.Text.Length > 10))
                {
                    CApp.ShowMessage("La cédula jurídica no puede ser de más o menos de 10 dígitos", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                else if ((cbxTipoID.SelectedValue.ToString() == "03" || cbxTipoID.SelectedValue.ToString() == "04") && (!vExpresion_Ext.IsMatch(mtbIdentificacion.Text) || mtbIdentificacion.Text.Length > 12))
                {
                    CApp.ShowMessage("El Dimex o NIT no puede ser de más o menos de 12 dígitos", "Factura de Compras", true);
                    mtbIdentificacion.Focus();
                }
                if (!vExpresion_Email.IsMatch(txt_Email.Text.Trim()))
                {
                    CApp.ShowMessage("El correo electronico no posee el formato correcto", "Factura de Compras", true);
                    txt_Email.Focus();
                }
                if (txt_Direccion.Text.Trim().Length > 100)
                {
                    CApp.ShowMessage("La direccion no puede exceder los 100 carateres", "Factura de Compras", true);
                    txt_Direccion.Focus();
                }
                if (txt_Telefono.Text.Trim().Length > 8)
                {
                    CApp.ShowMessage("El telefono no puede ser mayor a 8 digitos", "Factura de Compras", true);
                    txt_Telefono.Focus();
                }

                Utils.QueryParams parametros = new LLNet.Utils.QueryParams();
                parametros.AddReplaceParam("p_TIPOID", cbxTipoID.SelectedValue.ToString());
                parametros.AddReplaceParam("p_ID", mtbIdentificacion.Text.Trim().ToString());
                parametros.AddReplaceParam("p_NOMBRE", txt_Nombre.Text.Trim());
                parametros.AddReplaceParam("p_PROVINCIA", cbx_Provincia.Text.ToString().Trim());
                parametros.AddReplaceParam("p_CODPROV", cbx_Provincia.SelectedValue.ToString().Trim());
                parametros.AddReplaceParam("p_CANTON", cbx_Canton.Text.ToString().Trim());
                parametros.AddReplaceParam("p_CODCANTON", cbx_Canton.SelectedValue.ToString().Trim());
                parametros.AddReplaceParam("p_DISTRITO", cbx_Distrito.Text.ToString().Trim());
                parametros.AddReplaceParam("p_CODDIST", cbx_Distrito.SelectedValue.ToString().Trim());
                parametros.AddReplaceParam("p_BARRIO", cbx_Barrio.Text.ToString().Trim());
                parametros.AddReplaceParam("p_CODBARRIO", cbx_Barrio.SelectedValue.ToString().Trim());
                parametros.AddReplaceParam("p_DIRECCION", txt_Direccion.Text.Trim());
                parametros.AddReplaceParam("p_TELEFONO", txt_Telefono.Text.Trim());
                parametros.AddReplaceParam("p_EMAIL", txt_Email.Text.Trim());
                GUI.CApp.bll.ExecuteSql("GuardarProveedor", parametros, "PDV");

                Limpiar();

                CApp.ShowMessage("Proveedor guardado exitosamente", "Factura de Compras", true);

            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Factura de Compras", true);
            }
        }

        #endregion

        private void cbx_Provincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                mCantones();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cliente - Factura Electrónica", true);
            }
        }

        private void cbx_Canton_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                mDistritos();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cliente - Factura Electrónica", true);
            }
        }

        private void cbx_Distrito_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                mBarrios();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Cliente - Factura Electrónica", true);
            }
        }

        private void txt_Telefono_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                CApp.ShowMessage("Solo se permiten numeros", "Advertencia", true);
                e.Handled = true;
                return;
            }
        }

    }
}
