using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Catalog;

namespace OliviaAddIn
{
    class ListCamposVal
    {
        //**********************************************************************
        //Variables
        ListForm listDlg=null;
        string clase_path=null;
        esriGeometryType mi_tipogeom = esriGeometryType.esriGeometryPoint;
        string mi_title = "Seleccionar capa";
        int mi_parwnd = 0;
        public string err_st = "";

        //**********************************************************************
        //Funciones
        public ListCamposVal(string title, int parentWnd, esriGeometryType tipogeom)
        {            
            mi_tipogeom = tipogeom;
            mi_title = title;
            mi_parwnd = parentWnd;
        }

        /**
         * Abre diálogo para seleccionar una feature class a leer
         */
        public string selec_capa()
        {
            clase_path = FunGDB.selec_ftcls(mi_title, mi_parwnd);
            if (clase_path == null)
            {
                err_st = "No se ha seleccionado ninguna capa";
            }
            return clase_path;
        }

        /**
         * De la feature class, obtiene el listado de los campos y muestra el dlg
         */ 
        public int selec_campo(out string campo_str)
        {
            string[] elems = null;
            IFeatureClass ftclass=null;
            campo_str = null;
            int err = 0;

            try
            {
                //rellena los elementos a imprimir en el listado, en este caso,
                //los campos disponibles para elegir
                if (clase_path == null)
                {
                    err_st = "No se ha seleccionado ninguna capa";
                    return -1;
                }

                ftclass=FunGDB.abre_ftclass(clase_path);
                if(ftclass==null)
                {
                    err_st = "Error al abrir capa " + clase_path;
                    return -1;
                }
                if (ftclass.ShapeType != mi_tipogeom)
                {
                    err_st = "La geometría de la capa seleccionada " + clase_path + 
                        " no es " + mi_tipogeom.ToString();
                    return -1;
                }

                elems = FunGDB.dame_campos_clase(clase_path, out err);

                if (err > 0)
                {
                    switch (err)
                    {
                        case 1:
                            err_st = "Error al abrir tabla de atributos de la capa " + clase_path;
                            break;
                        case 2:
                            err_st = "Error al consultar la tabla de atributos de la capa " + clase_path;
                            break;
                        case 3:
                            err_st = "Error al consultar la tabla de atributos de la capa, no hay campos " + clase_path;
                            break;
                        case 4:
                            err_st = "Error al rellenar lista de atributos de la capa " + clase_path;
                            break;
                    }
                    return -1;
                }

                //crea el dialogo con el listado
                listDlg = new ListForm(elems, "Seleccionar campo para leer", false);

                //recoge el id del elemento seleccionado
                if (listDlg.nelem > 0)
                {
                    campo_str = listDlg.elem_str[0];
                    return listDlg.elem_id[0];
                }
                else
                {
                    err_st = "No se ha seleccionado ningún elemento";
                    campo_str = "";
                    return -1;
                }

            }
            catch (Exception)
            {
                err_st = "Error al seleccionar campo en la capa " + clase_path;
                return -1;
            }
            finally
            {
                FunGDB.libera(ftclass);
            }
        }

        /**
         * De la feature class, permite seleccionar el valor de un campo determinado
         */
        public int selec_valor_campo(string campo, out string valor_str)
        {
            string[] elems = null;
            valor_str=null;
            int err;

            //rellena los elementos a imprimir en el listado, en este caso,
            //todos los valores posibles de un campo dado
            if (clase_path == null)
            {
                err_st = "No se ha seleccionado ninguna capa";
                return -1;
            }

            try
            {
                
                elems = FunGDB.dame_valores_consulta(clase_path, campo, "", out err); //consulta todos: consulta = campo + " LIKE '%'";
                if (err > 0)
                {                    
                    switch (err)
                    {
                        case 1:
                            err_st = "Error al obtener los IDs de la capa " + clase_path;
                            break;
                        case 2:
                            err_st = "Error al abrir la tabla de atributos de la capa, no hay entidades " + clase_path;
                            break;
                        case 3:
                            err_st = "Error al abrir la tabla de atributos de la capa " + clase_path;
                            break;
                        case 4:
                            err_st = "Errores en la consulta de la tabla de atributos de la capa " + clase_path;
                            break;
                    }
                    return -1;
                    
                }

                //crea el dialogo con el listado
                listDlg = new ListForm(elems, "Seleccionar valor del campo para leer", false);

                //recoge el id del elemento seleccionado
                if (listDlg.nelem > 0)
                {
                    valor_str = listDlg.elem_str[0];
                    return listDlg.elem_id[0];
                }
                else
                {
                    valor_str = "";
                    err_st = "No se ha seleccionado ningún elemento";
                    return -1;//no se ha seleccionado
                }
            }
            catch (Exception)
            {
                err_st = "Error al seleccionar valor del campo en la capa " + clase_path;
                return -1;
            }
        }

        /**
         * De la feature class, permite seleccionar varios valores de un campo determinado
         */
        public int selec_valores_campo(string campo, out int[] valor_ids, out string[] valor_str)
        {
            string[] elems = null;
            valor_str = null;
            valor_ids = null;
            int err;
            
            //rellena los elementos a imprimir en el listado, en este caso,
            //todos los valores posibles de un campo dado
            if (clase_path == null)
            {
                err_st = "No se ha seleccionado ninguna capa";
                return -1;
            }

            try
            {                
                elems = FunGDB.dame_valunic_consulta(clase_path, campo, "", out err); //consulta todos
                if (elems == null)
                {
                    switch (err)
                    {
                        case 1:
                            err_st = "Error al obtener los IDs de la capa " + clase_path;
                            break;
                        case 2:
                            err_st = "Error al abrir la tabla de atributos de la capa " + clase_path;
                            break;
                        case 3:
                            err_st = "Errores en la consulta de valores únicos de la capa " + clase_path;
                            break;
                        case 4:
                            err_st = "Errores en la consulta de la tabla de atributos de la capa " + clase_path;
                            break;
                    }
                    return -1;

                }

                //crea el dialogo con el listado
                listDlg = new ListForm(elems, "Seleccionar valor del campo para leer", true);

                //recoge el id del elemento/s seleccionado
                if (listDlg.nelem > 0)
                {
                    valor_str = listDlg.elem_str;
                    valor_ids = listDlg.elem_id;
                    return listDlg.nelem;
                }
                else
                {
                    valor_str = null;
                    valor_ids = null;
                    err_st = "No se ha seleccionado ningún elemento";
                    return -1;//no se ha seleccionado
                }
            }
            catch (Exception)
            {
                err_st = "Error al seleccionar valor del campo en la capa " + clase_path;
                return -1;
            }
        }
    }
}
