using ArcGIS.Desktop.Framework.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
//using System.Runtime.InteropServices.WindowsRuntime;
using OliviaAddInPro.Model;
using OliviaAddInPro.Helper;

namespace OliviaAddInPro
{
    public abstract class PanelViewModelBase : PropertyChangedBase
    {

        #region Properties

        public abstract string DisplayName { get; }
        public PaneLimpiezaSub2ViewModel _subPanel2ViewModel;
        public PaneLimpiezaSub3ViewModel _subPanel3ViewModel;
        public PaneLimpiezaSub4ViewModel _subPanel4ViewModel;

        private string lblCapaElems = Resource1.String_selec_capa;
        public string LblCapaElems
        {
            get { return lblCapaElems; }
            set { base.SetProperty(ref lblCapaElems, value, () => LblCapaElems); }
        }
        private bool capaAbierta = false;
        public bool CapaAbierta
        {
            get { return capaAbierta; }
            set
            {
                capaAbierta = value;
                base.NotifyPropertyChanged("CapaAbierta");
            }
        }
        private string capaElems = "";
        public string CapaElems
        {
            get { return capaElems; }
            set
            {
                capaElems = value;
                base.NotifyPropertyChanged("CapaElems");
            }
        }
        #endregion Properties

        public bool LeeComun(TratamientoComun com, out string err_str)
        {
            err_str = string.Empty;
            ////////////////////////////////////////////////////////////
            ///Lee el panel 2
            ///Lee las capas
            com.GeomRestr = _subPanel2ViewModel.GeomRestr;
            if (com.GeomRestr!=null)
                com.TextGeomRestr = _subPanel2ViewModel.LblCapaRestr;
            com.GeomNiv = _subPanel2ViewModel.GeomNiv;
            if (com.GeomNiv != null)
                com.TextGeomNiv = _subPanel2ViewModel.LblCapaNiv;
            com.GeomZon = _subPanel2ViewModel.GeomZon;
            if (com.GeomZon != null)
                com.TextGeomZon = _subPanel2ViewModel.LblCapaZon;
            com.CoordsInstal = _subPanel2ViewModel.CoordsInstal;

            //lee el buffer de export
            if ((_subPanel2ViewModel.TxtBuffExport <= 0) || (_subPanel2ViewModel.TxtBuffExport > 100000))
            {
                err_str = "El buffer de exportación no está dentro de los límites configurados";
                return false;
            }
            com.BuffExport = _subPanel2ViewModel.TxtBuffExport;

            ////////////////////////////////////////////////////////////
            ///Lee el panel 3
            if (_subPanel3ViewModel.CheckSectAuto)
                com.NSect = 0; //envía 0 si es sector automat
            else
            {
                com.NSect = _subPanel3ViewModel.NumSect; //limitado entre 1 y 30 por código del spinner
                if (_subPanel3ViewModel.CheckAjustSect)
                    com.NSect = com.NSect * (-1);//lo envía negativo si es ajustar a sectores
            }
            com.NPtosCtrl = _subPanel3ViewModel.NumPtosCtrl; //limitado entre 3 y 10 por código del spinner
            com.IgnoAis = _subPanel3ViewModel.CheckIgnoAis;

            ////////////////////////////////////////////////////////////
            ///Lee el panel 4
            //lee los tiempos
            com.TDescarg = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeCargDesc);
            if ((com.TDescarg == 0) || (com.TDescarg > LimpiezaDef.Parametros.t_cardescM) || (com.TDescarg < LimpiezaDef.Parametros.t_cardescm))
            {
                err_str = "El valor introducido para el tiempo de carga y descarga no es válido.";
                return false;
            }
            com.TDesplIniFin = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeDespIniFin);
            if ((com.TDesplIniFin == 0) || (com.TDesplIniFin > LimpiezaDef.Parametros.t_despM) || (com.TDesplIniFin < LimpiezaDef.Parametros.t_despm))
            {
                err_str = "El valor introducido para el tiempo de desplazamiento no es válido.";
                return false;
            }
            com.TDescan = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeDescPers);
            if ((com.TDescan == 0) || (com.TDescan > LimpiezaDef.Parametros.t_descansoM) || (com.TDescan < LimpiezaDef.Parametros.t_descansom))
            {
                err_str = "El valor introducido para el tiempo de descanso no es válido.";
                return false;
            }
            com.TConv = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeJornadaConv);
            if ((com.TConv == 0) || (com.TConv > LimpiezaDef.Parametros.t_convM) || (com.TConv < LimpiezaDef.Parametros.t_convm))
            {
                err_str = "El valor introducido para el tiempo de trabajo por convenio no es válido.";
                return false;
            }
            com.HIni = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeIniJornada);
            //porcent reducc traf
            com.Trafico = _subPanel4ViewModel.TextPercentTrafico;
            if ((com.Trafico <= 0) || (com.Trafico > 100))
            {
                err_str = "El porcentaje de tráfico en las vías no está dentro de los límites configurados";
                return false;
            }
            return true;

        }
    }

    //******************************************************

    public static class PanelGlobal
    {
        public static bool IsValid(string str, int ini, int fin)
        {
            int i;
            return int.TryParse(str, out i) && i >= ini && i <= fin;
        }
        /**
        * Dado un tiempo en minutos devuelve las horas modulo 60 y los minutos restantes
        */
        
        public static DateTime Hm_int2DateTime(double t)
        {
            int[] hm = { 0, 0 };

            hm[0] = (int)(t / 60);
            hm[1] = (int)(t - hm[0] * 60);
            DateTime dt=new DateTime(2021, 01, 01, hm[0], hm[1], 0);
            return dt;
        }
        public static int Hm_DateTime2int(DateTime dt)
        {
            int h = 0;
            int m = 0;
            int t = 0;

            h = dt.Hour;
            m = dt.Minute;
            t = h * 60 + m;
            return t;
        }
        
    }
   
}
