/*
*  
*  $Id: comandopacs.h $
*  Ginkgo CADx Project
*
*  Copyright 2008-12 MetaEmotion S.L. All rights reserved.
*  http://ginkgo-cadx.com
*
*  This file is licensed under LGPL v3 license.
*  See License.txt for details
*
*/
#pragma once
//#define _GINKGO_TRACE
#include <api/globals.h>
#include <api/icommand.h>
#include <api/ivista.h>
#include <api/dicom/imodelodicom.h>
#include <api/controllers/ipacscontroller.h>

#include <main/controllers/dcmtk/dicomservers.h>



namespace GIL{
	class IModeloIntegracion;
	namespace DICOM{
		class IPACSController;
	}
}

namespace GADAPI {

	namespace PACS {

		typedef enum TipoAccion {
			TAC_Buscar,
			TAC_Descargar,
			TAC_AbortarTodos
		} TipoAccion;

		class IComandoPACSNotificador{
		public:
			virtual ~IComandoPACSNotificador() {}

			virtual void PACSCargarListado(IModeloDicom* pModelo) = 0;
		};
	}

	class ComandoPACSParams : public GNC::GCS::IComandoParams {

	public:

		typedef enum TipoAmbito {
			TA_Paciente,
			TA_Estudio,
			TA_Serie,
			TA_Imagen,
			TA_NotSpecified
		} TipoAmbito;

		ComandoPACSParams(const std::string& pacienteID, const std::string& pacienteNombre, const std::string& studyUID,
			const std::string& estudioAccNumber, const std::string& estudioModalidad, const std::string& estudioFechaDesde,
			const std::string& estudioFechaHasta, const std::string& studyTimeFrom, const std::string& studyTimeTo, const std::string& serverSeleccionado,
			TipoAmbito ambito, GNC::GCS::Ptr<IModeloDicom> pModeloDicom, GADAPI::PACS::IComandoPACSNotificador* pNotificador) :
		m_pacienteID(pacienteID),
		m_pacienteNombre(pacienteNombre),
		m_studyUID(studyUID),
		m_accessionNumber(estudioAccNumber),
		m_estudioModalidad(estudioModalidad),
		m_estudioFechaDesde(estudioFechaDesde),
		m_estudioFechaHasta(estudioFechaHasta),
		m_studyTimeFrom(studyTimeFrom),
		m_studyTimeTo(studyTimeTo),
		m_pNotificador(pNotificador),
		m_pModelo(pModeloDicom),
		m_Ambito(ambito),
		m_transferSyntax(GIL::DICOM::SendDefault)
		{
			
			if(serverSeleccionado == "") {
				if(DicomServerList::Instance()->GetList() != NULL) {
					m_serverSeleccionado = DicomServerList::Instance()->GetDefaultServer()->ID;
				} else {
					throw GIL::DICOM::PACSException(_Std("There is not any Remote PACS configured"));
				}
			} else {
				m_serverSeleccionado = serverSeleccionado;
			}
			m_informar=true;
			m_error = "";

			m_TipoAccion=GADAPI::PACS::TAC_Buscar;
			GTRACE("<< ComandoPACSParams::ComandoPACSParams(): " << this);
		}

		//download only specifying 
		ComandoPACSParams(const std::string& serverSeleccionado, const GIL::DICOM::DicomDataset& base) :
			m_transferSyntax(GIL::DICOM::SendDefault),
			m_pNotificador(NULL)

		{
			m_Ambito = TA_NotSpecified;
			
			m_base = base;
			m_pModelo = GNC::GCS::Ptr<IModeloDicom>(new IModeloDicom());

			if(serverSeleccionado == "") {
				//usaremos el primer servidor (por defecto)
				if(DicomServerList::Instance()->GetFirst() !=NULL) {
					m_serverSeleccionado = DicomServerList::Instance()->GetDefaultServer()->ID;
				} else {
					throw GIL::DICOM::PACSException(_Std("There is not any Remote PACS configured"));
				}
			} else {
				m_serverSeleccionado = serverSeleccionado;
			}

			m_informar = false;
			m_error = "";

			m_TipoAccion=GADAPI::PACS::TAC_Descargar;
			GTRACE("<< ComandoPACSParams::ComandoPACSParams(): " << this);
		}

		virtual ~ComandoPACSParams() {
			GTRACE(">> ComandoPACSParams::~ComandoPACSParams(): " << this);
			m_pNotificador = NULL;
			m_listaRutas.clear();
			GTRACE("<< ComandoPACSParams::~ComandoPACSParams(): " << this);
		}

	public:
		std::string              m_pacienteID;
		std::string              m_pacienteNombre;
		std::string              m_accessionNumber;;
		std::string              m_estudioModalidad;
		std::string              m_estudioFechaDesde;
		std::string              m_estudioFechaHasta;
		std::string					 m_studyTimeFrom;
		std::string					 m_studyTimeTo;
		std::string					 m_studyUID;

		std::list<std::string>   m_listaUID;
		std::list<std::string>   m_listaUIDImagenes;

		std::string              m_serverSeleccionado;

		std::list<std::string> m_listaRutas;

		bool                     m_informar;

		TipoAmbito               m_Ambito;
		std::string              m_error;

		GADAPI::PACS::IComandoPACSNotificador* m_pNotificador;
		GNC::GCS::Ptr<IModeloDicom> m_pModelo;

		GNC::GCS::Ptr<GIL::IModeloIntegracion> m_pModeloIntegracion;

		GIL::DICOM::DicomDataset m_base;

		GADAPI::PACS::TipoAccion m_TipoAccion;
		GIL::DICOM::TipoTransferSyntaxEnvio m_transferSyntax;
	};

	class ComandoPACSResult : public GNC::GCS::IComandoResult {
	public:
		ComandoPACSResult() {
		}

	};

	class EXTAPI ComandoPACS : public GNC::GCS::IComando {
	public:
		ComandoPACS(ComandoPACSParams* pParams);

    protected:
		virtual void Execute();
		virtual void Update();

		virtual void Search();
		virtual void Download();

    public:

		virtual bool NotificarProgreso(float progresoNormalizado, const std::string &texto);

		void LiberarRecursos();

		ComandoPACSParams* m_pPACSParams;
	};
}
