package de.hsadmin.remote;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.util.TextUtil;
import de.hsadmin.mods.dom.Domain;
import de.hsadmin.mods.dom.DomainOption;
import de.hsadmin.mods.user.UnixUser;

public class DomainRemote extends AbstractRemote {

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

	@Override
	protected void entity2map(AbstractEntity entity, Map<String, Object> resultMap) {
		Domain dom = (Domain) entity;
		String id = Long.toString(dom.getId());
		resultMap.put("id", id);
		String name = dom.getName();
		resultMap.put("name", name);
		String user = dom.getUser().getName();
		resultMap.put("user", user);
		String hive = dom.getHiveName();
		resultMap.put("hive", hive);
		String pac = dom.getUser().getPac().getName();
		resultMap.put("pac", pac);
		Date sDate = dom.getSince();
		if (assertNotNull(sDate)) {
			String since = TextUtil.format(sDate);
			resultMap.put("since", since);
		}
		List<String> domainOptionsList = new ArrayList<String>();
		resultMap.put("domainoptions", domainOptionsList);
		Set<DomainOption> domainOptions = dom.getDomainoptions();
		if (domainOptions != null) {
			for (DomainOption opt : domainOptions) {
				domainOptionsList.add(opt.getName());
			}
		}
	}

	@Override
	protected void map2entity(Map<String, Object> setParams, AbstractEntity entity) {
		Domain dom = (Domain) entity;
		String name = (String) setParams.get("name");
		String user = (String) setParams.get("user");
		if (assertNotNull(name)) {
			dom.setName(name);
		}
		if (assertNotNull(user)) {
			UnixUser u = new UnixUser();
			u.setName(user);
			dom.setUser(u);
		}
		Object domOptsObj = setParams.get("domainoptions");
		if (domOptsObj != null && domOptsObj instanceof Object[]) {
			Set<DomainOption> domainOptionsSet = new HashSet<DomainOption>();
			Object[] domOptions = (Object[]) domOptsObj;
			for (int i=0; i<domOptions.length; i++) {
				DomainOption domainOption = new DomainOption();
				domainOption.setName((String)domOptions[i]);
				domainOptionsSet.add(domainOption);
			}
			dom.setDomainoptions(domainOptionsSet);
		}
	}

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

}
