package com.tandbergtv.metadatamanager.specimpl.odgorf;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.tandbergtv.metadatamanager.model.SearchCriteria;
import com.tandbergtv.metadatamanager.model.Item.ItemType;
import com.tandbergtv.metadatamanager.search.MetadataValueFieldInfo;
import com.tandbergtv.metadatamanager.search.SearchField;
import com.tandbergtv.metadatamanager.search.SearchFieldBuilder;
import com.tandbergtv.metadatamanager.specimpl.IdentifierBase;
import com.tandbergtv.metadatamanager.util.MappingFileParser;

/**
 * This identifier is a fake one. This id should not be used to find the CMS title.
 * This unique id is(or could be different) different when the movie and preview are sent.
 * Use the Search Title node in Content Management resource type to locate the title based on the TrailerNumber   
 * 
 * @author spuranik
 *
 */
public class OdgOrfIdentifier extends IdentifierBase {

	private static final long serialVersionUID = 1L;
	// title billing id will be the unique id for this complete asset tree
	private static String EXTERNAL_TITLE_ID_XPATH = "ExternalTitleId";
	private String externalTitleId; 
	
	@Override
	public Map<String, String> getSpecIdentifiers() {
		Map<String, String> map = new HashMap<String, String>();
		map.put(EXTERNAL_TITLE_ID_XPATH, externalTitleId);
		return map;
	}

	@Override
	public Map<String, String> getTTVPaths() {
		Map<String, String> ttvPaths = new HashMap<String, String>();

		String externalIdXpath = MappingFileParser.getMapping(
				getMappingResourceUrl(), EXTERNAL_TITLE_ID_XPATH);
		if (externalIdXpath.trim().length() == 0) {
			throw new RuntimeException("Identifying field: " + EXTERNAL_TITLE_ID_XPATH
					+ " cannot be mapped to TTV xpath.");
		}

		ttvPaths.put(EXTERNAL_TITLE_ID_XPATH, externalIdXpath);
		return ttvPaths;
	}

	@Override
	public boolean isValidIdentifier() {
		if (externalTitleId != null && !externalTitleId.equals("")) {
				return true;
		}
		return false;
	}

	@Override
	public void setSpecIdentifiers(Map<String, String> identifiers) {
		if (identifiers.containsKey(EXTERNAL_TITLE_ID_XPATH)) {
			setExternalId(identifiers.get(EXTERNAL_TITLE_ID_XPATH));
		}
	}

	private void setExternalId(String billingId) {
		this.externalTitleId = billingId;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((externalTitleId == null) ? 0 : externalTitleId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		OdgOrfIdentifier other = (OdgOrfIdentifier) obj;
		if (externalTitleId == null) {
			if (other.externalTitleId != null)
				return false;
		} else if (!externalTitleId.equals(other.externalTitleId))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return externalTitleId;
	}

	@Override
	public List<SearchField> addSearchFields(SearchCriteria criteriaMap) {
		List<SearchField> fields = new SearchFieldBuilder().getAssetSearchFields(
				criteriaMap, true, null, true, true);
		Iterator<SearchField> fIter = fields.iterator();
		while (fIter.hasNext()) {
			SearchField idField = fIter.next();
			if (idField instanceof MetadataValueFieldInfo) {
				((MetadataValueFieldInfo) idField).setAssetType(ItemType.TITLE.toString());
				break;
			}
		}
		return fields;
	}

}
