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 System.Drawing.Design;
using System.Windows.Forms.Design;

namespace OliviaAddIn
{

    public class RecoCampos : FormCampos
    {
        /**
         *	@file RecoCampos.cs
         * Archivo de la clase ventana para la edición de los campos a leer en la planificación de recogida de residuos
         */
        /**
         *	Clase ventana para la edición de los campos a leer en la planificación de recogida de residuos
         */
        Recogida reco = null;

        //////////////////////////////////////////////////////////////
        
        ////////////////////////////////////////////
        /**
         * Clase para la estructura de propiedades
         */
        public class RecoCamposProps
        {
            bool is_kgrec_camp = true;//si es false, se introduce un valor fijo
            bool is_lleno = true;//si es false, se habilita is_kgrec_camp

            [DisplayNameAttribute("ID")]
            [DescriptionAttribute("Campo donde leer el identificador del contenedor.")]
            [Category("Campos")]
            public string id
            {
                get { return RecogidaDef.campos.cons_id; }
                set { RecogidaDef.campos.cons_id = value; }
            }
            [DisplayNameAttribute("Tipo de recogida")]
            [DescriptionAttribute("Campo donde leer el nombre del tipo de recogida.")]
            [Category("Campos")]
            public string nomrec
            {
                get { return RecogidaDef.campos.cons_nomrec; }
                set { RecogidaDef.campos.cons_nomrec = value; }
            }
            [DisplayNameAttribute("Lateralidad recogida")]
            [DescriptionAttribute("Campo donde leer la lateralidad de recogida.")]
            [Category("Campos")]
            public string lateral
            {
                get { return RecogidaDef.campos.cons_lateral; }
                set { RecogidaDef.campos.cons_lateral = value; }
            }
            [DisplayNameAttribute("Fracción")]
            [DescriptionAttribute("Campo donde leer la fracción de residuos.")]
            [Category("Campos")]
            public string fracc
            {
                get { return RecogidaDef.campos.cons_fracc; }
                set { RecogidaDef.campos.cons_fracc = value; }
            }
            [DisplayNameAttribute("Capacidad")]
            [DescriptionAttribute("Campo donde leer la capacidad de los contenedores.")]
            [Category("Campos")]
            public string capac
            {
                get { return RecogidaDef.campos.cons_capac; }
                set { RecogidaDef.campos.cons_capac = value; }
            }
            [DisplayNameAttribute("Unidades")]
            [DescriptionAttribute("Campo donde leer el número de contenedores de la ubicación.")]
            [Category("Campos")]
            public string uds
            {
                get { return RecogidaDef.campos.cons_uds; }
                set { RecogidaDef.campos.cons_uds = value; }
            }
            //----------------------------------------------------------------
            [DisplayNameAttribute("Orgánica")]
            [DescriptionAttribute("Atributo de fracción Orgánica.")]
            [Category("Atributos de Fracción")]
            public string atr_frac_org
            {
                get { return RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica]; }
                set { RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica] = value; }
            }
            [DisplayNameAttribute("Resto")]
            [DescriptionAttribute("Atributo de fracción Resto.")]
            [Category("Atributos de Fracción")]
            public string atr_frac_res
            {
                get { return RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto]; }
                set { RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto] = value; }
            }
            [DisplayNameAttribute("Envases")]
            [DescriptionAttribute("Atributo de fracción Envases.")]
            [Category("Atributos de Fracción")]
            public string atr_frac_env
            {
                get { return RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases]; }
                set { RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases] = value; }
            }
            [DisplayNameAttribute("Papel")]
            [DescriptionAttribute("Atributo de fracción Papel.")]
            [Category("Atributos de Fracción")]
            public string atr_frac_pap
            {
                get { return RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel]; }
                set { RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel] = value; }
            }
            [DisplayNameAttribute("Vidrio")]
            [DescriptionAttribute("Atributo de fracción Vidrio.")]
            [Category("Atributos de Fracción")]
            public string atr_frac_vid
            {
                get { return RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio]; }
                set { RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio] = value; }
            }
            [DisplayNameAttribute("Trasera")]
            [DescriptionAttribute("Atributo de carga Trasera.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_carg_tras
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera] = value; }
            }
            [DisplayNameAttribute("Lateral")]
            [DescriptionAttribute("Atributo de carga Lateral.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_carg_lat
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral] = value; }
            }
            [DisplayNameAttribute("Superior")]
            [DescriptionAttribute("Atributo de carga Superior.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_varg_sup
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior] = value; }
            }
            [DisplayNameAttribute("Bilateral")]
            [DescriptionAttribute("Atributo de carga Bilateral.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_varg_bil
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral] = value; }
            }
            [DisplayNameAttribute("Bolseo")]
            [DescriptionAttribute("Atributo de carga Bolseo.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_varg_bol
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta] = value; }
            }
            [DisplayNameAttribute("Lavado")]
            [DescriptionAttribute("Atributo de carga Lavado.")]
            [Category("Atributos de Tipo de Carga")]
            public string atr_varg_lav
            {
                get { return RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado]; }
                set { RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado] = value; }
            }
            //----------------------------------------------------------------
            [DisplayNameAttribute("Cont. lleno o info sens")]
            [ReadOnly(false)]
            [RefreshProperties(System.ComponentModel.RefreshProperties.All)]
            [DescriptionAttribute("SÍ: Se recogen contenedores llenos o se va a emplear la información externa de sensores (se necesita "+
                "información de densidad). NO: Se pone un valor fijo de carga en kg o se bsuca en la tabla el campo especificado en Kg/recogida.")]
            [Category("Otras opciones")]
            [TypeConverter(typeof(Prop_si_no))]
            public bool kgrec_lleno
            {
                get { return is_lleno; }
                set
                {
                    is_lleno = value;

                    //Coge la propiedad de cuando es kg/reco en nombre del campo
                    PropertyDescriptor descriptor_combo = TypeDescriptor.GetProperties(this.GetType())["kgrec_selec"];
                    ReadOnlyAttribute attribute_combo = (ReadOnlyAttribute)
                                    descriptor_combo.Attributes[typeof(ReadOnlyAttribute)];

                    //Coge la propiedad de cuando es kg/reco en nombre del campo
                    PropertyDescriptor descriptor_camp = TypeDescriptor.GetProperties(this.GetType())["kgrec_camp"];
                    ReadOnlyAttribute attribute_camp = (ReadOnlyAttribute)
                                    descriptor_camp.Attributes[typeof(ReadOnlyAttribute)];

                    //Coge la propiedad de cuando es kg/reco en valor fijo
                    PropertyDescriptor descriptor_val = TypeDescriptor.GetProperties(this.GetType())["kgrec_val"];
                    ReadOnlyAttribute attribute_val = (ReadOnlyAttribute)
                                    descriptor_val.Attributes[typeof(ReadOnlyAttribute)];

                    if (attribute_combo != null && attribute_camp != null && attribute_val != null)
                    {
                        //Pone la propiedad kgrec_selec, kgrec_camp y la propiedad kgrec_val a modo, sólo lectura para que no se pueda editar
                        //o modo editable, en función de is_kgrec_camp
                        System.Reflection.FieldInfo aField_combo = attribute_combo.GetType().GetField("isReadOnly",
                            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                        aField_combo.SetValue(attribute_combo, is_lleno);
                        if (is_lleno)
                        {
                            System.Reflection.FieldInfo aField_camp = attribute_camp.GetType().GetField("isReadOnly",
                                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                            aField_camp.SetValue(attribute_camp, is_lleno);

                            System.Reflection.FieldInfo aField_val = attribute_val.GetType().GetField("isReadOnly",
                                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                            aField_val.SetValue(attribute_val, is_lleno);
                        }
                        else
                        {
                            System.Reflection.FieldInfo aField_camp = attribute_camp.GetType().GetField("isReadOnly",
                                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                            aField_camp.SetValue(attribute_camp, !is_kgrec_camp);

                            System.Reflection.FieldInfo aField_val = attribute_val.GetType().GetField("isReadOnly",
                                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                            aField_val.SetValue(attribute_val, is_kgrec_camp);
                        }


                    }


                }
            }
            //-----------------------------------------------------------------------
            [DisplayNameAttribute("Campo Kg/recogida")]
            [ReadOnly(false)]
            [RefreshProperties(System.ComponentModel.RefreshProperties.All)]
            [DescriptionAttribute("SÍ: Editar el nombre del campo. NO: Introducir un valor fijo.")]
            [Category("Otras opciones")]
            [TypeConverter(typeof(Prop_si_no))]
            public bool kgrec_selec
            {
                get { return is_kgrec_camp; }
                set
                {
                    is_kgrec_camp = value;

                    //Coge la propiedad de cuando es kg/reco en nombre del campo
                    PropertyDescriptor descriptor_camp = TypeDescriptor.GetProperties(this.GetType())["kgrec_camp"];
                    ReadOnlyAttribute attribute_camp = (ReadOnlyAttribute)
                                    descriptor_camp.Attributes[typeof(ReadOnlyAttribute)];

                    //Coge la propiedad de cuando es kg/reco en valor fijo
                    PropertyDescriptor descriptor_val = TypeDescriptor.GetProperties(this.GetType())["kgrec_val"];
                    ReadOnlyAttribute attribute_val = (ReadOnlyAttribute)
                                    descriptor_val.Attributes[typeof(ReadOnlyAttribute)];

                    if (attribute_camp != null && attribute_val != null)
                    {
                        //Pone la propiedad kgrec_camp a modo solo lectura para que no se pueda editar
                        //y la propiedad kgrec_val a editable, o viceversa, en función de is_kgrec_camp
                        System.Reflection.FieldInfo aField_camp = attribute_camp.GetType().GetField("isReadOnly",
                            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                        aField_camp.SetValue(attribute_camp, !is_kgrec_camp);

                        System.Reflection.FieldInfo aField_val = attribute_val.GetType().GetField("isReadOnly",
                            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

                        aField_val.SetValue(attribute_val, is_kgrec_camp);
                    }


                }
            }

            [DisplayNameAttribute("Kg/recogida (Campo)")]
            [ReadOnly(false)]
            [DescriptionAttribute("Campo donde leer los kg de recogida de los contenedores.")]
            [Category("Otras opciones")]
            public string kgrec_camp
            {
                get { return RecogidaDef.campos.cons_kgrec; }
                set { RecogidaDef.campos.cons_kgrec = value; }
            }
            [DisplayNameAttribute("Kg/recogida (Valor)")]
            [ReadOnly(true)]
            [DescriptionAttribute("Valor fijo a emplear como kg de recogida de los contenedores.")]
            [Category("Otras opciones")]
            public int kgrec_val
            {
                get { return RecogidaDef.kgrec_cont; }
                set { RecogidaDef.kgrec_cont = value; }
            }
        }
        ////////////////////////////////////////////////////        
        public RecoCamposProps props;
        public RecoCampos(Recogida reco)
        {
            props = new RecoCamposProps();
            Text = "Campos de la capa de Recogida";
            reinicia();
            propertyGrid.SelectedObject = props;
            this.reco = reco;
        }

        private void reinicia()
        {
            props.id = RecogidaDef.campos_def.cons_id;
            props.nomrec = RecogidaDef.campos_def.cons_nomrec;
            props.lateral = RecogidaDef.campos_def.cons_lateral;
            props.fracc = RecogidaDef.campos_def.cons_fracc;
            props.capac = RecogidaDef.campos_def.cons_capac;
            props.uds = RecogidaDef.campos_def.cons_uds;
            props.kgrec_selec = RecogidaDef.kgrec_camp;
            props.kgrec_lleno = RecogidaDef.lleno;
            props.kgrec_camp = RecogidaDef.campos_def.cons_kgrec;
            props.kgrec_val = RecogidaDef.kgrec_cont;

            //----------------------------------------------------------------
            props.atr_frac_org = RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica];
            props.atr_frac_res = RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto];
            props.atr_frac_env = RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases];
            props.atr_frac_pap = RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel];
            props.atr_frac_vid = RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio];

            props.atr_carg_tras = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera];
            props.atr_carg_lat = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral];
            props.atr_varg_sup = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior];
            props.atr_varg_bil = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral];
            props.atr_varg_bol = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta];
            props.atr_varg_lav = RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado];

        }

        protected override void button_reset_Click(object sender, EventArgs e)
        {
            reinicia();
            propertyGrid.Refresh();
        }

        /*
         * Se validan los campos modificados y se guarda en memoria los nombres de los nuevos campos.
         * También se guardará en el archivo .INI una vez se vaya a ejecutar el proceso.
         */
        protected override void btn_acept_Click(object sender, EventArgs e)
        {
            RecogidaDef.campos_def.cons_id = props.id;
            RecogidaDef.campos_def.cons_nomrec = props.nomrec;
            RecogidaDef.campos_def.cons_lateral = props.lateral;
            RecogidaDef.campos_def.cons_fracc = props.fracc;
            RecogidaDef.campos_def.cons_capac = props.capac;
            reco.rec_capac = RecogidaDef.campos_def.cons_capac;
            RecogidaDef.campos_def.cons_uds = props.uds;
            reco.rec_uds = RecogidaDef.campos_def.cons_uds;
            RecogidaDef.campos_def.cons_kgrec = props.kgrec_camp;
            reco.rec_kg = RecogidaDef.campos_def.cons_kgrec;
            RecogidaDef.lleno = props.kgrec_lleno;
            RecogidaDef.kgrec_camp = props.kgrec_selec;
            RecogidaDef.kgrec_cont = props.kgrec_val;

            if (RecogidaDef.lleno)
            {
                reco.rec_kgrec_cont = -1;
            }
            else if (RecogidaDef.kgrec_camp)
            {
                reco.rec_kgrec_cont = 0;
            }
            else
            {
                reco.rec_kgrec_cont = props.kgrec_val;
            }


            RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Organica] = props.atr_frac_org  ;
            RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Resto] = props.atr_frac_res  ;
            RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Envases] = props.atr_frac_env  ;
            RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Papel] = props.atr_frac_pap  ;
            RecogidaDef.tipos_fracc_str[(int)RecogidaDef.TiposFracción.Vidrio] = props.atr_frac_vid  ;

            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Trasera] = props.atr_carg_tras  ;
            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lateral] = props.atr_carg_lat  ;
            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Superior] = props.atr_varg_sup;
            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Bilateral] = props.atr_varg_bil;
            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.BolseoPtaPta] = props.atr_varg_bol;
            RecogidaDef.tipos_carg_str[(int)RecogidaDef.TiposCarga.Lavado] = props.atr_varg_lav;


            //que se lea la tabla otra vez..
            DialogResult = DialogResult.OK;
            Close();
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // RecoCampos
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.ClientSize = new System.Drawing.Size(292, 309);
            this.Name = "RecoCampos";
            this.ResumeLayout(false);

        }

        protected override void button_guardar_Click(object sender, EventArgs e)
        {
            base.button_guardar_Click(sender, e);
        }


    }
}
