using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OliviaDef;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Forms;

namespace OliviaAddIn
{
    /**
     * @file Ejecuta.cs
     * Clase de ejecución del grueso de la herramienta Olivia.
     * Guarda en un archivo de configuración la información configurada,
     * lanza una ventana de progreso,
     * llama al proceso OliviaTask, y va leyendo en el archivo de configuración
     * el progreso de la ejecución, que actualiza en la ventana.
     */
    /**
     * Clase de ejecución del grueso de la herramienta Olivia.
     * Guarda en un archivo de configuración la información configurada,
     * lanza una ventana de progreso,
     * llama al proceso OliviaTask, y va leyendo en el archivo de configuración
     * el progreso de la ejecución, que actualiza en la ventana.
     */
    class Ejecuta
    {
        //*************************************************************************************
        //Enums
        public enum ModosEjec
        {
            Secto,
            Planif,
            SoloPlanif,
        }
        //*************************************************************************************
        //Variables         
        /**
         * Cadena general de escritura de parámetros de configuración para envío por socket
         */
        public string str_cfg;
        /**
         * Cadena general para indicar los errores de ejecución
         */
        public string err_str="";
        /**
         * Cadena general de escritura de parámetros para envío por socket
         */
        public string str;        

        //*************************************************************************************
        //Métodos
        public Ejecuta()
        {
            str = "";
        }

        ~Ejecuta() // destructor (finalizers)
        {
            // cleanup statements...
        }

        /**
         * Comienza las funciones de ejecución
         */
        public bool ejec()
        {
            add_cfg_comun();

            //lanza ventana marchando que lanza proceso en bucle para actualizar barra progreso
            OliviaGlob.progr_eje = new ProgresoEjec();

            //lanza proceso OliviaTask
            if (!lanza())
            {
                err_str = "Error al arrancar OliviaTask (programa de procesado de datos): No ha arrancado correctamente la instancia OliviaTask";
                return false;
            }
            
            OliviaGlob.progr_eje.start(str_cfg);

            return true;
        }

        /**
         * Añade al str de cfg los parametros de configuración comunes a limpieza y recogida
         */
        private void add_cfg_comun()
        {
            str_cfg = str_cfg +
                //campos de la red navegable
                GeneralDef.EjecGeoParamSep + GeneralDef.GTC_onew + GeneralDef.EjecGeoParamIgual + ComunDef.CamposNW.cons_onew + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTC_kph + GeneralDef.EjecGeoParamIgual + ComunDef.CamposNW.cons_kph + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTC_fow + GeneralDef.EjecGeoParamIgual + ComunDef.CamposNW.cons_fow + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTC_name + GeneralDef.EjecGeoParamIgual + ComunDef.CamposNW.cons_name + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTA_TF + GeneralDef.EjecGeoParamIgual + ComunDef.AtributosNW.atr_TF + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTA_FT + GeneralDef.EjecGeoParamIgual + ComunDef.AtributosNW.atr_FT + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTA_N + GeneralDef.EjecGeoParamIgual + ComunDef.AtributosNW.atr_N + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GTA_pedes + GeneralDef.EjecGeoParamIgual + ComunDef.AtributosNW.atr_pedes + " " +
                //nombre del tratamiento
                GeneralDef.EjecGeoParamSep + GeneralDef.GG_strtto + GeneralDef.EjecGeoParamIgual + OliviaGlob.nomb_tto + " " +
                //paths de archivos
                GeneralDef.EjecGeoParamSep + GeneralDef.GG_pd + GeneralDef.EjecGeoParamIgual + OliviaGlob.Paths.PathData + " " +
                GeneralDef.EjecGeoParamSep + GeneralDef.GG_pn + GeneralDef.EjecGeoParamIgual + OliviaGlob.Paths.PathNW + " ";
        }

        /**
         * Arranca el proceso OliviaTask con los parámetros correspondientes
         */
        private bool lanza()
        {
            Process[] pg;
            string args;
            ProcessStartInfo pfi;

            try
            {
                //van ParamN parámetros, sin incluir, si se añaden, incrementar ParamN
                args =  GeneralDef.EjecGeoParamSep + GeneralDef.GG_tipo + GeneralDef.EjecGeoParamIgual + ((int)OliviaGlob.tip_oliv).ToString() + " " +
                        GeneralDef.EjecGeoParamSep + GeneralDef.GG_ip + GeneralDef.EjecGeoParamIgual + OliviaGlob.ip + " " +
                        GeneralDef.EjecGeoParamSep + GeneralDef.GG_port + GeneralDef.EjecGeoParamIgual + OliviaGlob.puerto + " " +
                        GeneralDef.EjecGeoParamSep + GeneralDef.GG_tout + GeneralDef.EjecGeoParamIgual + OliviaGlob.t_out_sock + " " +
                        GeneralDef.EjecGeoParamSep + GeneralDef.GG_pt + GeneralDef.EjecGeoParamIgual + OliviaGlob.Paths.PathTemp + " " +
                        GeneralDef.EjecGeoParamSep + GeneralDef.GG_pcfg + GeneralDef.EjecGeoParamIgual +  OliviaGlob.Paths.PathWork + "cfg_geo.ini" + " " ;

                pfi = new ProcessStartInfo(OliviaGlob.Paths.PathExeOlivia, args);
                System.Diagnostics.Process.Start(pfi);

                //comprueba que haya arrancado OliviaTask
                //le da 2 seg de margen para que arranque
                pg = OliviaGlob.progr_eje.is_process(OliviaDef.GeneralDef.NombOlvTasks, 2, true);
                if (pg == null)
                {
                    MessageBox.Show("No está OliviaTask, args= " + args, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }  
       
    }
          
}
