using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OliviaAddInPro.Helper;
using OliviaAddInPro.Model;
using System.Collections.ObjectModel;
using static OliviaAddInPro.Model.ComunDef;
using ArcGIS.Desktop.Framework.Threading.Tasks;

namespace OliviaAddInPro.Services
{
    class RecogidaServ : EjecServ
    {
        private Recogida reco;

        public RecogidaServ(Recogida _reco)
        {
            if (_reco == null)
                _reco = OliviaGlob.Reco;
            reco = _reco;
        }

        /*
         * Lee la capa que se ha seleccionzdo de recogida y se comprueba que contiene los campos necesarios
         * Devuelve 0 si va todo bien, 1 si le falta el campo de kgreco, y 2 si le faltan más u otro
         */
        public int CompruebaCamposReco(string pathCapa)
        {
            int NCAMPS = 5;
            string[] camps;
            camps = new string[NCAMPS];
            
            camps[0] = RecogidaDef.campos_def.cons_fracc;
            camps[1] = RecogidaDef.campos_def.cons_nomrec;
            camps[2] = RecogidaDef.campos_def.cons_lateral;
            camps[3] = RecogidaDef.campos_def.cons_uds;
            camps[4] = RecogidaDef.campos_def.cons_kgrec;
            //camps[5] = RecogidaDef.campos_def.cons_id;
            int compCamp = HelperGdb.CheckFileds(pathCapa, camps);
            ErrStr = HelperGdb.OutStr;
            if (compCamp == 0)
                return 0;
            else if (compCamp == 1 && HelperGdb.OutStr.Contains(RecogidaDef.campos_def.cons_kgrec)) //le falta el de kg recogida, que igual no le hace falta
                return 1;
            else
                return 2;  //error o le falta 1 que no es el de kg reco o más
        }

        /*
         * A partir de los datos leidos de la capa de recogida se rellena el desplegable de fracción a partir de los datos existentes en la capa.
         */
        public ObservableCollection<string> DameVals(string capa, string campo)
        {
            ObservableCollection<string> valores;
            ErrStr = string.Empty;
            valores = HelperGdb.GetFieldVals(capa,campo,true).Result;
            return valores;    
        }

        /**
         * Acciones para comenzar ejecución
         * Modo 0, sectorizar
         * Modo 1, planificar
         */
        public Respuesta<bool> Ejecuta(ModosEjec modo)
        {
            var res = new Respuesta<bool>()
            {
                Value = false
            };

            com = (TratamientoComun)reco;
            string nombFileAmbs = string.Empty;
            
            //Prepara consulta
            ErrStr = string.Empty;
            
            if (!PreparaConsulta(out nombFileAmbs))
            {
                res.Error.Add("No se ha seleccionado una consulta válida" + reco.ConsultaAmbs);
                return res;
            }
            if (com.ProgrSrc._ProgrSrc.Getcancelled())
            {
                res.Error.Add(Resource1.String_cancel_progreso);
                return res;
            }
            //Prepara nombre
            //Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp
            reco.NombreShpExp_PrefTto = nombFileAmbs + DameStrPoligs();

            string msg = "";
            //comienza ejecucion
            if (!ExportaEjec(modo, out msg))
            {
                res.Error.Add(msg);
                return res;
            }
            if (com.ProgrSrc._ProgrSrc.Getcancelled())
            {
                res.Error.Add(Resource1.String_cancel_progreso);
                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;
            reco.ConsultaAmbs = DameAmbsConsulta(out nombFileAmbs);
            if (string.IsNullOrEmpty(reco.ConsultaAmbs))
            {
                return false;
            }
            return true;
        }
        
        public string DameAmbsConsulta(out string cap_abrev)
        {
            string consulta, orstr, aux;

            consulta = null;
            cap_abrev = "";
            aux = "";
            orstr = null;

            if (reco.TipoFrac != -1)
            {
                consulta = consulta + orstr + "(" + RecogidaDef.filtro_str[reco.TipoFrac] + ")";
                cap_abrev = reco.TipoFrac.ToString("00");
                cap_abrev = "F" + cap_abrev + "_";
                if (consulta == "()")
                    consulta = "";
            }
            if (orstr == null)
                orstr = " AND ";
            if (reco.TipoCarg != -1)
            {
                consulta = consulta + orstr + "(" + RecogidaDef.filtro_str[RecogidaDef.tipos_fracc_str.Length + reco.TipoCarg] + ")";
                aux = reco.TipoCarg.ToString("00");
                cap_abrev = cap_abrev + "C" + aux;
                if (consulta == "()")
                    consulta = "";
            }
            if (reco.TipoLate > 0)
            {
                consulta = consulta + orstr + "(" + RecogidaDef.campos_def.cons_lateral + " = '" + RecogidaDef.tipos_lateralidad[reco.TipoLate] + "'" + ")";
                if (consulta == "()")
                    consulta = "";
            }
            return consulta;
        }       
        
    }
}
