#pragma once

#include <map>
#include <string>
#include "Slot.h"

using namespace std;


/********************************************************************************************
	Clase singleton que contiene la lista de lectores detectados en el equipo, identificados 
	por su ID.
	Además, guarda una caché con los lectores que se han detectado hasta ese momento, para
	almacenar la correspondencia entre el nombre del lector y el ID asignado.
	El ID de los lectores es un número asignado de forma secuencial.
********************************************************************************************/
class CSlotList
{

	public:

		// Método que genera la única instancia de la clase y devuelve una referencia a la misma
		static CSlotList & getInstance()
		{
			static CSlotList rSlotList;
			return rSlotList;
		}

		// Destructor
		~CSlotList(void);

		// Método que actualiza la lista de lectores del equipo
		void Update(void);

		// Método que obtiene el número de lectores según la última actualización de la lista
		unsigned long GetNumberOfSlots(bool bSupportedTokenPresent);

		// Método que genera una lista de los IDs de lectores según la última actualización de la lista
		void GetSlots(unsigned long * pulSlots, bool bTokenPresent);
		
		// Método que obtiene el lector con un determinado ID
		CSlot & GetSlot(unsigned long ulId);

		// Método que aguarda el cambio de estado en alguno de los slots de la lista
		unsigned long WaitForSlotStatusChange(unsigned long *pSlotId, DWORD dwTimeout);
		
	private:
		//
		// Lista de lectores detectados historicamente en el equipo
		// Tenemos dos relaciones:
		//		Identificador asignado a cada lector a partir del nombre de PC/SC
		//		Puntero al Objeto a partir de su edentificador, para acceder al lector.
		//
		map<string, unsigned long> m_mapName2Id;
		map<unsigned long, CSlot *> m_mapId2Slot;

		// Lista de los identificadores asignados a los lectores detectados en 
		// la última llamada a SCardListReaders()
		vector<unsigned long> m_slotList;

		// Próximo ID a asignar
		unsigned long m_ulNextId;

		// Constructor privado, dado que es una clase singleton
		CSlotList(void);

		// Método que obtiene un nuevo ID de lector
//		unsigned long GetNewId();

};
