#pragma once

/**
*	@file olv.h
*	Archivo de definiciones generales de la herramienta Olivia de OliviaTasks.
*/

/**
*	Includes para archivo de definiciones OliviaDef.cs                                                                 
*/
#ifdef OLIVIA_COMPILA
#define class namespace
#define public
#define static
#define string CString
#include "OliviaDef.cs"
#undef class
#undef public
#undef static
#undef string
#include "olv_tasks_def.h"
#include "_log.h"
#include "_app.h"
#include "olv_limp_def.h"

/**
 * Tareas de ejecución para la ventana de progreso
 */
enum TareasProgr
{
    OLV_TAREA_CALC,				///<Indica que está calculando el tiempo restante
	OLV_TAREA_IMP,				///<Indica que está importando
	OLV_TAREA_SENS,				///<Indica que está leyendo de los sensores
	OLV_TAREA_UNE_NW_AMB,		///<Indica que está uniendo la red navegable a los ámbitos
	OLV_TAREA_TOPO_NW,			///<Indica que está generando topología
	OLV_TAREA_COST_AMB,			///<Indica que está calculando los costes entre ámbitos
	OLV_TAREA_GUARD_MAT,		///<Indica que está guardando las matrices
	OLV_TAREA_MULTITASK,		///<Indica que está en proceso multitask
	OLV_TAREA_CALC_SEC,			///<Indica que está calculando el número de sectores
	OLV_TAREA_PERMU,			///<Indica que está calculando permutaciones
	OLV_TAREA_SECTORIZ,			///<Indica que está sectorizando
	OLV_TAREA_PLANIF,			///<Indica que está planificando
	OLV_TAREA_LEE_SECTO,		///<Indica que está leyendo sectorización
	OLV_TAREA_FIN_SEC,			///<Indica que ha finalizado la sectorización
	OLV_TAREA_FIN_PLANIF,		///<Indica que ha finalizado la planificación
	OLV_TAREA_FIN_OK,			///<Indica que ha finalizado bien
    OLV_TAREA_FIN_NOK,			///<Indica que ha finalizado mal
    OLV_TAREA_N					///<Número tareas
};

/**
 * Tipos de ejecución de Olivia
 */
enum TiposEjecOlv
{
	OLV_EJEC_NDEBUG,
	OLV_EJEC_SECT,
	OLV_EJEC_PLAN,
	OLV_EJEC_DEBUG_SIGUE,
	OLV_EJEC_TODO,
	OLV_EJEC_DEBUG_SIGUE_NOPLAN,
	OLV_EJEC_DEBUG_NOSIGUE,
};

/**
* Paths de la configuración
*/
typedef struct PathsOlv{
	char	path_temp[MAX_PATH];	///<Path temporal de generación de archivos intermedios
	char	path_res_rut[MAX_PATH];	///<Path del shp con el resultado de las rutas
	char	path_res_pt[MAX_PATH];	///<Path del shp con el resultado de los puntos de control
	char	path_res_sec[MAX_PATH];	///<Path del shp con el resultado de las entidades de los ámbitos de trabajo asociada la info de sector
	char	path_data[MAX_PATH];	///<Path del shp con datos a planificar, ya filtrados e intersecados con las zonas y niveles
	char	path_nw[MAX_PATH];		///<Path del shp con la red navegable
	char	path_cfg_geo[MAX_PATH];
	char	pfin;					///<Para marcar el final de la estructura
}PathsOlv;

class Colv_limp;
class Colv_reco;
class Colv_shp;
class Colv_sock;
class Clock;
class Msmain;
/**
*	Clase general de la herramienta Olivia de OliviaTasks.
*/
class OLV_EXPORT COlivia :  public C_app, public C_escucha_log
{
public:
	//*************************************************************************************
    //Variables
	int				tipo_oliv;					///<Tipo de ejecución de la herramienta
	int				tarea;						///<Índice de la tarea por la que va
	int				progreso;					///<Progreso, de 0 a 100
	int				modo_ejec;
	BOOL			ya_config;
	BOOL			fin;						///<Indica si ha finalizado la ejecución
	BOOL			modo_multitask;			
	char			tareas_str[OLV_TAREA_N][OLV_MAX_TAREA];
	char			msg_proce[OLV_MAX_MSG_PROCE];///<Mensaje de error general
	Msmain			*mfrm;						///<Puntero al MainFrame					
	PathsOlv		paths;						///<Estructura con los paths de trabajo	
	Clock			*lock;						///<Interlock para gestión de memoria
	Colv_limp		*olv_limp;					///<Instancia para la utilidad de la limpieza viaria
	Colv_reco		*olv_reco;					///<Instancia para la utilidad de la recogida de residuos
	Colv_sock		*olv_sock;					///<Instancia para socket de comunicaciones con Olivia AddIn
	InfoIniTask		infotask;
	bool isDebug;
	
	//*************************************************************************************
    //Funciones
	COlivia(void);
	~COlivia(void);
	////////////////
	void prueba();

	BOOL coge_param(char *param);
	BOOL inicia(char *cmdline, char *err, int nerr);
	int dame_tarea();
	int dame_progre();
	BOOL pon_config(char *config);
	void cancela();
	BOOL dame_param(char *token, char *param, int sizeparam);
	BOOL dame_param(char *token, int *param);
	BOOL dame_param(char *token, double *param);
	void destruye_socket(LPARAM lp);
	void rellena_tareas();
	void borra_log_old();
	
	BOOL creaSocProces( Colv_limp *olv );
	void crea_socket_multi( LPARAM lp );
	BOOL destruyeSocProces( Colv_limp *olv );
	void destruye_socket_multi( LPARAM lp );
	void log_ext( __time64_t tiemp, char *modulo, char *fmt );
};
OLV_EXPORT void olvlog (int nivel, char * modulo, char *fmt, ...);
#endif