/*using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Core.Internal.CIM;
using ArcGIS.Desktop.Framework.Threading.Tasks;*/
using OliviaAddInPro.Helper;
using OliviaAddInPro.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using static OliviaAddInPro.Model.ComunDef;

namespace OliviaAddInPro.Services
{
    public class LimpiezaServ : EjecServ
    {
        private Limpieza limp;

        public LimpiezaServ(Limpieza _limp)
        {
            if (_limp == null)
                _limp = OliviaGlob.Limp;
            limp = _limp;
        }
        /**
         * Acciones para comenzar ejecución
         * Modo 0, sectorizar
         * Modo 1, planificar
         */
        public Respuesta<bool> Ejecuta(ModosEjec modo)
        {
            var res = new Respuesta<bool>()
            {
                Value = false
            };
            MyCancelableProgressorSource cps = limp.ProgrSrc;

            com = (TratamientoComun)limp;
            string nombFileAmbs = string.Empty;
            //Prepara consulta
            ErrStr = string.Empty;
            if (!PreparaConsulta(out nombFileAmbs))
            {
                res.Error.Add("No se ha seleccionado una consulta válida" + limp.ConsultaAmbs);
                return res;
            }           
            
            //Prepara nombre
            limp.NombreShpExp_PrefTto = "T" + limp.TipoTto.ToString("00") + nombFileAmbs + DameStrPoligs();

            string msg = "";
            //comienza ejecucion
            if(!ExportaEjec(modo, out msg))
            {
                res.Error.Add(msg);
                //cierra y borra las capas si le ha dado tiempo a exportar
                FinProcServ.BorraFiles();                
                return res;
            }

            //cierra las capas que se han abierto durante la exportación
            CierraCapas();

            res.Value = true;

            return res;

        }

        public bool PreparaConsulta(out string nombFileAmbs)
        {
            nombFileAmbs = string.Empty;
            limp.ConsultaAmbs = DameAmbsConsulta(out nombFileAmbs);
            if (string.IsNullOrEmpty(limp.ConsultaAmbs))
            {
                return false;
            }
            return true;
        } 

        public string DameAmbsConsulta(out string ambs_file)
        {
            string consulta, orstr;

            consulta = string.Empty;
            ambs_file = "";
            orstr = null;
            var n = limp.AmbitosSel.Length;
        
            for (int i = 0; i < n; i++)
            {
                if (limp.AmbitosSel[i])
                {                    
                    consulta = consulta + orstr + "(" + LimpiezaDef.filtro_str[i] + ")";
                    ambs_file = ambs_file + i.ToString("00");
                    if (orstr == null)
                        orstr = " OR ";
                }
            }
            ambs_file = "_A" + ambs_file;
            if (consulta == "()")
                consulta = "";

            return consulta;
        }

        /**
         * Comprueba lo necesario para ver si hay campos para la planificación
         */
        public bool CompruebaPlanif2()
        {
            //NO SE USA AQUÍ, ESTÁ EN EJECSERV
            //si ha importado no hace falta que compruebe, seguro que las tiene
            if (OliviaGlob.IsConfig2() && ComprCamposPlanif(limp.CapaElems))
                return true;
            //no ha importado, comprueba capa
            if (ComprCamposPlanif(limp.CapaElems))
                return true;

            return false;
            /*
            string path = null;
            if (!HelperGlobal.ponMsg("En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, " +
                "necesarias para planificar. ¿Desea utilizar la sectorización de otra capa?",MessageBoxImage.Question,"OLIVIA",
                MessageBoxButton.YesNo))
                return false;

            //saca diálogo para elegir capa
            path = HelperGdb.OpenFileDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassLine | HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint);
            if (string.IsNullOrEmpty(path))
            {
                return false;
            }

            //comprueba que en la nueva capa haya columnas de planif
            if (!ComprCamposPlanif(path))
            {
                return false;
            }

            //almacena la info de secto auxiliar
            limp.CapaAuxPlanif = path;
            return true;*/
            
        }

        /*
         * Lee la capa que se ha seleccionzdo de limpieza y se comprueba que contiene los campos necesarios
         */
        public bool CompruebaCamposLimp(string pathCapa)
        {
            string[] camps = limp.GetCampos(pathCapa);
            int res = 1;
            if ((camps == null) || (HelperGdb.CheckFileds(pathCapa, camps) != 0))
            {
                ErrStr = HelperGdb.OutStr;
                return false;
            }
            return true;            
        }
        /**
         * Lee la gdb y devuelve el array de ámbitos en función de si hay en la gdb o no
         */
        public bool[] BuscAmbGdb(string pathCapa)
        {
            string consulta;
            long numero_lin;
            bool[] amb_gdb = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];//se inician a false
            string ftclass;

            //mira a ver si hay ejes de calle
            ftclass = LimpiezaDef.ftclass[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle];
            consulta = LimpiezaDef.filtro_str[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle];
            numero_lin = HelperGdb.GetNumElems(OliviaGlob.Paths.PathGdbNw, consulta);
            if (numero_lin > 0)
            {
                amb_gdb[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;
            }
            //mira a ver si hay el resto de capas y tienen entidades            
            for (int i = (int)LimpiezaDef.AmbitsTra.AmbBordLibreMec; i < (int)LimpiezaDef.AmbitsTra.AmbN; i++)
            {
                consulta = LimpiezaDef.filtro_str[i];
                numero_lin = HelperGdb.GetNumElems(pathCapa, consulta);

                if (numero_lin > 0)
                {
                    amb_gdb[i] = true;
                }
            }

            return amb_gdb;
        }
        /**Devuelve el array de los ámbitos comunes y no comunes de las opciones de un tratamiento tto
         * Es un array de longitud el número de ámbitos totales, con true en las posiciones en los que el ámbito sea común o 
         * no común en las opciones
         */
        public bool[] DameAmbTto(int tto)
        {
            int i;
            bool sig;
            bool[] amb_com = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];

            for (int j = 0; j < (int)LimpiezaDef.AmbitsTra.AmbN; j++)
            {
                sig = false;
                for (i = 0; i < LimpiezaDef.ambs_val[tto].n_ops && !sig; i++)
                {
                    if (LimpiezaDef.ambs_val[tto].ambs_ops[i].ambs[j]) //con que encuentre uno true lo pone y pasa al siguiente
                    {
                        amb_com[j] = sig = true;
                    }
                }
            }
            return amb_com;
        }
        
    }
}
