#pragma once
#include "TaskProcess.h"
#include "mapmatrix.h"
#include "DijkstraUtiles.h"
#include "b_file.h"
#include "olv_tasks_def.h"
#include "Matrix2d.h"


class InfoIndiceEx: public InfoIndice
{
public:

	Cgarray<int> dat;
	int getFlags(int na)
	{
		return dat[na*3+2];
	}
	virtual int get(int iamb, int iextremo)
	{
		return dat[iamb*3+iextremo];
	}
	inline void clear()
	{
		dat.borra();
	}
	
	BOOL leeFile(char* path);
};

struct InfoIniTask;
/*!
 * Clase para cálculos de Olivia en modo Multitask
 * 
 */
class OlvTaskProcess : public TaskProcess
{
public:
	//info de procesos
	bool va_mal;
	int ithr;//id del thread, lo recibe al arrancar como arg
	int amb_ini;//ambito inicio, lo calcula
	int amb_fin;//ambito fin, lo calcula
	/////////////////////////
	//variables para run	
	Cdijkstra_arch arch_dj;
	InfoIndiceEx ia;//puntero a info asoc
	CmapMatFloat costes;//matriz de costes entre nodos
	Djkt_ang_ady *angs;//angulos entre nodos
	Matrix2d<float> cost_amb;//matriz de costes entre ambitos
	/////////////////////////
	//recibe por socket
	InfoIniTask info;
	//////////////////////////
	OlvTaskProcess(void);
	~OlvTaskProcess(void);
	virtual void preTask();
	virtual void inTask();
	virtual void postTask();
	virtual void run();
	virtual void desconecta();
	/////////////////////////
	//funciones run
	BOOL calcula_cost_amb_sub(int amb_ini,int amb_fin, int ith);
	BOOL lee_mats();
	BOOL guarda_cost_amb();
	void enviaLog();
	BOOL calcula_cost_ambThr();
	BOOL lanza_thr_calc();
};

class  ThCalcCostes: public Cth
{
public:
	OlvTaskProcess *pclas;
	int	ithr;
	int ini;//fila inicio 
	int fin;//fila fin
	BOOL mal;//indica si ha ido bien
	virtual void run();
};