#pragma once
#ifdef OLIVIA_COMPILA
/**
*	@file olv_limp.h
*	Archivo de definiciones y variables de la utilidad de limpieza viaria del programa Olivia.
*/
#include "olv_limp_def.h"
#include "olv_geom.h"
#include "mapmatrix.h"
#include "CartoBase.h"

class COlivia;
class Colv_limp_thr;
class Colv_limp_thr_aux;
class Colv_tasks;
class Csock_svThread;
class Colv_limp_thr;

struct Secu_amb;
struct Djkt_ang_ady;
struct Info_conjs;
struct Campos_dbf;
struct Info_tramos;
//////////////////////////////////////////////////
/**
*	Clase de definiciones y variables de la utilidad de limpieza viaria del programa Olivia.
*/
class Colv_limp
{
public:
	//*************************************************************************************
    //Variables
	bool			socCreado;
	char			nomb_tto[OLV_SHP_SZ_CAMP_CHAR];	///<Nombre del tratamiento para escribir en el shp
	int				pp;				///<Entero para pruebas
	int				tipo_ambit;		///<Indica si los ámbitos son lineales o puntuales
	int				n_amb;			///<Número de entidades de ámbitos, la cuenta empieza en 0 porque es la primera capa que se carga
	int				n_nw;			///<Número de entidades de la red navegable, la cuenta empieza en ini_nw porque no es la primera que se carga
	int				uds_tto;		///<Unidades de tratamiento: m/h, m2/h, min
	int				npts_ctrl;		///<Número de puntos de control
	int				nsec;			///<Número de sectores
	int				nsec_act;		///<Número de sectores activos, siempre <= que nsec
	int				nsec_orig;		///<Número de sectores original, se usa por si se corrige el num de sectores porque haya alguno vacío
	int				res_circ;		///<Restricción de circulación
	int				lateral;		///<Lateralidad, 0 o -1 ambos, 1 derecha, 2 izda
	int				tipo_shp_viaj;	///<Indica la forma en que se guardan los viajes según la enum TipoViajes
	int				t_sal;			///<Tiempo de salida/llegada a la instalación, en segundos
	int				nod_instal;		///<Nodos en la red de la instalación
	int				nod_plant;		///<Nodos en la red de la planta donde va a descargar
	BOOL			igno_ais;		///<Indica si ignorar aislados
	BOOL			barr_mix;		///<Indica si es barrido mixto
	double			f_trafic;		///<Factor de reducción de la velocidad en calles por el tráfico en tanto por 1
	double			calc_nsec;		///<Indica si el número de sectores es calculado (almacena el coste del sector) o impuesto (0)
	double			margen_sect;	///<Margen de diferencia entre sectores, en tanto por uno
	double			t_ini;			///<Tiempo inicial en el que comienza la ruta, en segundos, en base 24 h
	double			t_tto;			///<Tiempo de tratamiento, en minutos
	double			v_despl;		///<Velocidad de desplazamiento, en km/h. Si es 0, es determinada por la vía.
	double			t_conv;			///<Tiempo de trabajo por convenio, en segundos
	double			t_desc;			///<Tiempo de descanso de personal, en segundos
	double			t_despl;		///<Tiempo de desplazamiento, en segundos, sólo ida, si es ida y vuelta, x2
	double			t_carg;			///<Tiempo de carga y descarga, en segundos
	double			ancho_via;		///<Ancho medio de la vía
	double			coor_instal[3];	///<Coordenadas de la instalación
	double			ang_lim;		///<Ángulo límite de giro, en radianes
	double			anchos_def[OLV_ANCH_DEF_N];	///<Anchos por defecto de las entidades de limpieza, los lee del ini
	double			DESV_MAX;		///<Desviación máxima entre sectores para dejar de igualar sectores, en porcentaje
	double			DESV_MAX_ABS;	///<Desviación máxima para dejar de igualar, en segundos
	CmapMatInt		tip_conj;		///<Matriz de NconjxNconj con 1 si es nw entre conjunciones. La rellena el thread
	COlivia			*olv;			///<Instancia general de la utilidad
	Colv_limp_thr	*thr_limp;		///<Instancia del thread de limpieza, que hace las operaciones
	Colv_tasks		*olv_tasks;
	Csock_svThread	*soc;
	Matrix2d<float>	cost_amb;		///<Matriz de NambxNamb con los costes (seg) entre ámbitos. La rellena el thread
	Cdijkstra_arch	arch_dj;		///<Archivo de nodos dj
	CmapMatFloat	cost_conj;		///<Matriz de NconjxNconj con los costes (seg) entre conjunciones. La rellena el thread
	Secu_amb		*ord_sec_plan;	///<Array con la información de la secuencia y distancias de la planta a los ámbitos
	Secu_amb		*ord_sec;		///<Array de Namb con la información de la secuencia y distancias entre ámbitos
	Djkt_ang_ady	*ang_conj;		///<Matriz de Nconj, con los ángulos (º) de giro entre conjunciones. La rellena el thread
	Campos_dbf		camps;			///<Campos de la dbf a leer, se rellenan en constructor o con info de socket
	Info_sec		*sec;			///<Array de Nsec con la info de cada sector. Lo rellena el thread
	Info_amb_sec	*amb_sec;		///<Array de Namb con la info de los ámbitos ya asigandos a un sector. Lo rellena el thread
	Info_conjs		conjs;			///<Conjunciones, contiene el array de conjunciones de la red y su tamaño
	Info_planif		*plan;			///<Array de planificaciones, una por cada sector
	Info_inw_dmin	*inww_amb;		///<Array de Namb que almacena la carretera más cercana al punto inicial y al final (Nambx2)
									///<del ámbito si es lineal o la más cercana si es puntual. La rellena el thread.
	CartoBase					carto;
	std::map<int,Info_aso2>		iaso;  ///<Map con mismos elementos que entidades la carto, con la información asociada
	std::vector<Info_tramos>	*tramos;

	//*************************************************************************************
    //Funciones
	Colv_limp(COlivia *olv);
	virtual ~Colv_limp(void);
	////////////////
	void libera_memo_secto();
	void prueba();
	virtual BOOL inicia();
	virtual int pon_config(char *config);
	virtual void cancela();
	virtual void rellena_campos();
	virtual void dame_cost(double ltot, int ia, float *cost, float *cost2);
	double dame_ancho(char *observ, char *tipo);
	BOOL rellena_campos_ini(char *path);
	BOOL guarda_campos_ini(char *path);
};
#endif