package managedbean.common;

import TO.FamilyDoctorTO;
import TO.PatientTO;
import TO.SpecialistDoctorTO;
import common.UserType;
import ejb.common.CommonFacadeRemote;

/***
 * 
 * @author Marcos García Núñez (mgarcianun@uoc.edu)
 *
 */
public class ValidationUtils {
	static final String NIF_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
	static final String NIE_LETTERS = "XYZ";

	/**
	 * 
	 * @param nif NIF a validar
	 * @return true si es válido, false en otro caso
	 */
	public static boolean isValid(String nif) {
		if (nif == null)
			return false;

		nif = nif.toUpperCase().replace("-", "").replace(".", "");

		if (nif.length() < 2 || nif.length() > 9)
			return false;

		if (nif.startsWith("X")) {
			nif = nif.replace('X', '0');
		} else if (nif.startsWith("Y")) {
			nif = nif.replace('Y', '1');
		} else if (nif.startsWith("Z")) {
			nif = nif.replace('Z', '2');
		}

		char letra = nif.charAt(nif.length() - 1);
		if (NIF_LETTERS.indexOf(letra) < 0)
			return false;

		String numbers = nif.substring(0, nif.length() - 1);

		try {
			if (NIF_LETTERS.charAt(Integer.parseInt(numbers) % 23) == letra)
				return true;
		} catch (Exception ex) {
			return false;
		}

		return false;
	}

	/**
	 * Comprueba si un NIF existe para un tipo de usuario. * No se permite que el
	 * mismo NIF esté registrado como médico de familia y como especialista. * Se
	 * permite que el mismo NIF esté registrado como paciente y como médico (de
	 * familia o especialista)
	 * 
	 * @param remoteSvc Servicio Remoto para recuperar datos.
	 * @param userType  Tipo de usuario a comprobar
	 * @param nif       NIF a comprobar.
	 * @param id        Parámetro opcional, id del usuario actual (si encuentra el
	 *                  mismo nif y el usuario coincide no se devuelve la
	 *                  coincidencia)
	 * @return true si el NIF ya estaba registrado para un usuario diferente.
	 */
	public static boolean checkIfNifAlreadyRegistered(CommonFacadeRemote remoteSvc, UserType userType, String nif, Integer id) {
		boolean nifExists = false;
		
		if (userType == null || remoteSvc == null)
			return nifExists;
		
		switch (userType) {
		case ADMINISTRATOR:
			break;
		case FAMILY_DOCTOR:
		case SPECIALIST_DOCTOR:
			FamilyDoctorTO fd = remoteSvc.findFamilyDoctorByNif(nif);

			if (fd == null) {
				// Si el nif no está en uso para un médico de familia, reivsamos si está en uso
				// para los especialistas
				SpecialistDoctorTO sd = remoteSvc.findSpecialistDoctorByNif(nif);

				if (sd != null && (id == null || sd.getId() != id))
					nifExists = true;
			} else if (id == null || fd.getId() != id)
				// Si se trata de un usuario diferente, entonces está repetido
				nifExists = true;

			break;
		case PATIENT:
			PatientTO pat = remoteSvc.findPatientByNif(nif);

			// Si se trata de un usuario diferente, entonces está repetido
			if (pat != null && (id == null || pat.getId() != id))
				nifExists = true;
			break;
		}

		return nifExists;
	}
}
