package ejb.medicalTest;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

import javax.ejb.Remote;

import TO.MedicalTestTO;
import TO.PatientTO;
import TO.QuestionTO;
import TO.SpecialistDoctorTO;
import common.MedicalTestType;

/**
 * Interfaz remota del EJB Definimos los métodos que estarán disponibles para los clientes del EJB
 * 
 * @author rorden
 *
 */
@Remote
public interface MedicalTestFacadeRemote {

	// *********************************************************************
	// QUESTION RESPONSE

	/**
	 * Realizar una pregunta al médico por un paciente
	 * 
	 * @param userID Este parámetro en el enunciado era del doctor, se ha cambiado al del paciente ya que los EJB
	 * no tienen el contexto de la sesión y de esta forma se puede conseguir el médico al que se realiza la 
	 * pregunta.
	 * @param title
	 * @param message
	 */
	public String askQuestion(int userID, String title, String message);

	/**
	 * El médico responde a una pregunta
	 * 
	 * @param questionId Se ha cambiado a questionID ya que es más directa la identificación de la pregunta
	 * a la que se va a responder
	 * @param response
	 */
	public void answerQuestion(int questionId, String response);

	/**
	 * Recuperar las preguntas sin respuesta para un médico
	 * 
	 * De utilidad para paciente y médico de familia. No para médico especialista.
	 * 
	 * @param familydoctorid
	 */
	public List<QuestionTO> listAllPendingQuestions(int familyDoctorId);

	/**
	 * Recuperar las preguntas hechas por un paciente
	 * 
	 * NEW
	 */
	public List<QuestionTO> listAllMyQuestions(int userId);

	/**
	 * Recuperar una pregunta por su String
	 * 
	 * @param idQuestion Se ha cambiado al identificador de la pregunta, ya que es más directa
	 * su identificación.
	 */
	public QuestionTO getQuestion(int idQuestion);

	// ********************************************************************* MEDICAL
	// TEST

	public List<MedicalTestTO> loadMedicalTestForPatient(int patientID);

	public List<MedicalTestTO> loadMedicalTestForFamilyDoctor(int familyDoctorID);

	public List<MedicalTestTO> loadMedicalTestForSpecialistDoctor(int specialistDoctorID);

	public List<MedicalTestTO> loadMedicalTestForFamilyDoctor(int familyDoctorID, int patientID);

	public List<MedicalTestTO> loadMedicalTestForSpecialistDoctor(int specialistDoctorID, int patientID);

	public List<PatientTO> loadPatientsForSpecialistDoctor(int specialistDoctorID, String searchTerm, int pageNumber, int pageSize);

	public List<PatientTO> loadPatientsForFamilyDoctor(int familyDoctorID, String searchTerm, int pageNumber, int pageSize);

	/**
	 * Añadir una prueba médica a un paciente Dado que será añadida por el médico especialista en sesión no hace falta más información.
	 * 
	 * @param idMedicalTest
	 * @param date
	 * @param time
	 * @param testType      Pudiera llegar a ser: Análisis de sangre, resonancias magnéticas y TAC
	 * @param observations
	 */
	public MedicalTestTO addMedicalTest(int patientID, int doctorSpecialistID, LocalDate date, LocalTime time, MedicalTestType testType, String observations) throws Exception;

	/**
	 * Recuperar una prueba médica por ID
	 * 
	 * @param idMedicalTest
	 */
	public MedicalTestTO getMedicalTest(int idPatient);

	/**
	 * Añadir una imagen a una prueba médica
	 * 
	 * @param idMedicalTest
	 * @param image
	 */
	public void addImage(int idMedicalTest, String image);

	/**
	 * Actualizar/Pisar una imagen a una prueba médica
	 * 
	 * @param idMedicalTest
	 * @param image
	 */
	public void updateImage(int idMedicalTest, String image);

	/**
	 * Eliminar una imagen a una prueba médica
	 * 
	 * @param idMedicalTest
	 */
	public void removeImage(int idMedicalTest);

	public Long getSpecialistDoctorByMedicalSpecialtyCount(int specialityId);

	/**
	 * Listar médicos con una especialidad concreta
	 * 
	 * @param speciality
	 */
	public List<SpecialistDoctorTO> findSpecialistDoctorByMedicalSpecialty(int specialityId, int pageNumber, int pageSize);
}