package ejb.systemAdmin;

import java.util.ArrayList;
import java.util.Collection;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import TO.MedicalSpecialtyTO;
import TO.PrimaryHealthCareCenterTO;
import jpa.MedicalSpecialtyJPA;
import jpa.PrimaryHealthCareCenterJPA;

/**
 * EJB Session Bean Class para la Practica 2, Ejercicio 1 (ISCSD) Implementa los
 * métodos de la capa de negocio que implementan la logica de negocio y la
 * interacción con la capa de persistencia.
 * 
 * @author mark
 *
 */
@Stateless
public class SystemAdminFacadeBean implements SystemAdminFacadeRemote {

	// Persistence Unit Context
	@PersistenceContext(unitName = "MyHealth")
	private EntityManager entman;

	/**
	 * Metodo que devuelve todas las especialidades medicas
	 */
	public Collection<MedicalSpecialtyTO> listAllMedicalSpecialities() {
		return this.listPagedMedicalSpecialities(0, 0);
	}

	/**
	 * Metodo que devuelve las especialidades médicas de forma paginada
	 * 
	 * Acepta como parametro la página (comenzando en 0) y el número de elementos de
	 * cada página
	 * 
	 */
	public Collection<MedicalSpecialtyTO> listPagedMedicalSpecialities(int pageNumber, int pageSize) {
		Query query = entman.createQuery("from MedicalSpecialtyJPA order by name");

		if (pageSize > 0) {
			query.setFirstResult(pageNumber * pageSize);
			query.setMaxResults(pageSize);
		}

		@SuppressWarnings("unchecked")
		Collection<MedicalSpecialtyJPA> allJPA = query.getResultList();
		Collection<MedicalSpecialtyTO> allSpecialities = new ArrayList<MedicalSpecialtyTO>();

		for (MedicalSpecialtyJPA ms : allJPA) {
			allSpecialities.add(new MedicalSpecialtyTO(ms.getName(), ms.getDescription()));
		}

		return allSpecialities;
	}

	public Collection<PrimaryHealthCareCenterTO> listAllCAPs() {
		return this.listPagedAllCAPs(0, 0);
	}

	public Collection<PrimaryHealthCareCenterTO> listPagedAllCAPs(int pageNumber, int pageSize) {
		Query query = entman.createQuery("from PrimaryHealthCareCenterJPA order by name");

		if (pageSize > 0) {
			query.setFirstResult(pageNumber * pageSize);
			query.setMaxResults(pageSize);
		}

		@SuppressWarnings("unchecked")
		Collection<PrimaryHealthCareCenterJPA> allJPA = query.getResultList();
		Collection<PrimaryHealthCareCenterTO> allCAPs = new ArrayList<PrimaryHealthCareCenterTO>();

		for (PrimaryHealthCareCenterJPA cap : allJPA) {
			allCAPs.add(new PrimaryHealthCareCenterTO(cap.getName(), cap.getLocation()));
		}

		return allCAPs;
	}
}
