package de.hsadmin.mods.email;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.AbstractModuleImpl;
import de.hsadmin.core.model.AuthorisationException;
import de.hsadmin.core.model.HSAdminException;
import de.hsadmin.core.model.Transaction;
import de.hsadmin.mods.pac.Pac;
import de.hsadmin.mods.user.UnixUser;

public class EMailAliasModuleImpl extends AbstractModuleImpl {

	@Override
	public List<AbstractEntity> search(Class<? extends AbstractEntity> entityClass,
			String condition, String orderBy) throws HSAdminException {
		if (orderBy == null || orderBy.length() == 0) {
			orderBy = "ORDER BY obj.name ASC";
		}
		return super.search(entityClass, condition, orderBy);
	}

	@Override
	public AbstractEntity add(AbstractEntity newEntity) throws HSAdminException {
		Transaction transaction = getTransaction();
		UnixUser loginUser = transaction.getLoginUser();
		EMailAlias alias = (EMailAlias) newEntity;
		String name = alias.getName();
		if (name.length() > 5 && (name.charAt(5) != '-') || name.length() == 6) {
			throw new AuthorisationException(loginUser, "add", newEntity);
		}
		EntityManager em = getTransaction().getEntityManager();
		Query qPac = em.createQuery("SELECT obj FROM Pacs obj WHERE obj.name = :pacName");
		qPac.setParameter("pacName", name.substring(0, 5));
		Object singleResult = qPac.getSingleResult();
		Pac pac = (Pac) singleResult;
		if (pac == null || !pac.isReadAllowedFor(loginUser)) {
			throw new AuthorisationException(loginUser, "add", newEntity);
		}
		if (!name.startsWith(pac.getName())) {
			throw new AuthorisationException(loginUser, "add", newEntity);
		}
		alias.setPac(pac);
		return super.add(newEntity);
	}
	
}
