/*
	Менеджер открытия и закрытия пула сокетов.
	Каждый сокет в своём потоке для прослушивания ответов с сервера.
	Пришедние ответы накапливаются в отдельном списке для отправке дальше в терминал через (сокет, порт)
*/
#ifndef SOKETS_H_
#define SOKETS_H_

#include "ComPort.h"
#include "SocketPort.h"
#include "BluePad.h"
#include "DataToSend.h"
#include "structs.h"

#define HAVE_STRUCT_TIMESPEC
//#include <pthread.h>
#include <thread>
#include <mutex>
//---------------------------------------------------------------------------
class Sockets;
//---------------------------------------------------------------------------
class THSocket
{
public:
	Sockets* parent;
	int id;
	bool m_exe_thread_read; //true - то нужно продолжать выволнение false - то выйти из потоков (не защищаю мютексом думаю это приемлеммо)
	std::thread* m_threadid_read;
	bool m_exe_thread_write; //true - то нужно продолжать выволнение false - то выйти из потоков (не защищаю мютексом думаю это приемлеммо)
	std::thread* m_threadid_write;

	SocketPort* sp;
	char data_write[65535]; //Данные для отправки (после отправки удалятся)
	int length_write; //Длина данных для отправки (после отправки в 0)
	char data_read[65535]; //Данные которые были получены (после чтения удаляются)
	unsigned short len_read; //Длина полученных данных (после чтения в 0)

	bool m_SaveLog; ///<Сохранять ли в лог файл
	std::string m_LogFilePath; ///<Куда сохранять лог файл

	THSocket();
	~THSocket();

	static void thread_func_read(void *pData);
	static void thread_func_write(void *pData);
};
//---------------------------------------------------------------------------
class BluePad;
//---------------------------------------------------------------------------
//Класс для обслуживания списка сокетов (и их потоков команд)
class Sockets
{
private:
	BluePad* m_bp;

	TSimpleList<THSocket*>* m_list;
public:
	std::mutex m_mutexList; //Для доступа к массиву "socket"

	bool m_SaveLog; ///<Сохранять ли в лог файл
	std::string m_LogFilePath; ///<Куда сохранять лог файл

	Sockets(BluePad* bp);
	~Sockets();


	bool openSoket(int id,std::string address,int port,int timeout); //Открыть сокет и запустить потоки
	bool closeSoket(int id); //Закрыть удалить сокет и остановить связанные с ним потоки
	bool sendData(int id, char* data, int len); //Отправить данные в сокет
	
	DataToSend* getDataToSend(); //Получить данные для последующей отправки

/*
	[ID]: [0..255] : SOCKET ID
		[TYPE] :
		[01] : TCP
		[02] : UDP
		[03] : TCP TLS
		[04] : UDP TLS
		<ADDRESS> : [0..255][0..255][0..255][0..255] : SOCKET ADDRESS
		<PORT> : [PORT HIGH][PORT LOW] : SOCKET PORT
		<TIMEOUT> : [TIMEOUT HIGH][TIMEOUT LOW] : TIMEOUT IN SECONDS
*/

};

//---------------------------------------------------------------------------
#endif