package de.hsadmin.remote;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.Transaction;
import de.hsadmin.mods.dom.Domain;
import de.hsadmin.mods.email.EMailAddress;

public class EMailAddressRemote extends AbstractRemote {

	@Override
	protected void entity2map(Transaction tx, AbstractEntity entity, Map<String, Object> map) {
		EMailAddress adr = (EMailAddress) entity;
		long id = adr.getId();
		String domain = adr.getDomain().getName();
		String admin = adr.getDomain().getUser().getName();
		String pac = adr.getDomain().getUser().getPac().getName();
		String target = adr.getTarget();
		String localpart = adr.getLocalpart();
		String subdomain = adr.getSubdomain();
		String emailaddress = adr.getEMailAddress();
		String fulldomain = adr.getFullDomain();
		map.put("id", Long.toString(id));
		if (assertNotNull(domain)) map.put("domain", domain);
		if (assertNotNull(admin)) map.put("admin", admin);
		if (assertNotNull(pac)) map.put("pac", pac);
		if (assertNotNull(target)) {
			StringTokenizer tokenizer = new StringTokenizer(target, ",");
			List<String> tokenList = new ArrayList<String>(); 
			while (tokenizer.hasMoreTokens()) {
				tokenList.add(tokenizer.nextToken().trim());
			}
			map.put("target", tokenList);
		}
		if (assertNotNull(localpart)) map.put("localpart", localpart);
		if (assertNotNull(subdomain)) map.put("subdomain", subdomain);
		if (assertNotNull(emailaddress)) map.put("emailaddress", emailaddress);
		if (assertNotNull(fulldomain)) map.put("fulldomain", fulldomain);
	}

	@Override
	protected void map2entity(Transaction tx, Map<String, Object> map, AbstractEntity entity) {
		EMailAddress adr = (EMailAddress) entity;
		String localpart = (String) map.get("localpart");
		if (assertNotNull(localpart)) {
			adr.setLocalpart(localpart);
		}
		String subdomain = (String) map.get("subdomain");
		if (assertNotNull(subdomain)) {
			adr.setSubdomain(subdomain);
		}
		Object l = map.get("target");
		if (l != null && l instanceof Object[]) {
			StringBuffer tBuff = new StringBuffer();
			Object[] targetObjArray = (Object[]) l;
			for (int idx=0; idx<targetObjArray.length; idx++) {
				if (targetObjArray[idx] instanceof String) {
					if (tBuff.length() > 0) {
						tBuff.append(',');
					}
					tBuff.append((String) targetObjArray[idx]);
				}
			}
			adr.setTarget(tBuff.toString());
		} else {
			if (l != null && l instanceof String) {
				adr.setTarget((String) l);
			}
		}
		String domain = (String) map.get("domain");
		if (assertNotNull(domain)) {
			Domain dom = new Domain();
			dom.setName(domain);
			adr.setDomain(dom);
		}
	}

	@Override
	protected Class<? extends AbstractEntity> getEntityClass() {
		return EMailAddress.class;
	}

	@Override
	protected void regularizeKeys(Map<String, String> whereParams) {
		replaceKey(whereParams, "domain", "domain.name");
		replaceKey(whereParams, "pac", "domain.user.pac.name");
		replaceKey(whereParams, "admin", "domain.user.name");
	}

	@Override
	protected String getOrderBy() {
		return "ORDER BY obj.domain.name ASC, obj.subdomain ASC, obj.localpart ASC";
	}

}
