package com.tandbergtv.metadatamanager.specimpl.odgorf;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.w3c.dom.Document;

import com.tandbergtv.metadatamanager.model.Asset;
import com.tandbergtv.metadatamanager.model.Field;
import com.tandbergtv.metadatamanager.model.Relation;
import com.tandbergtv.metadatamanager.model.Group.GroupType;
import com.tandbergtv.metadatamanager.model.Item.ItemType;
import com.tandbergtv.metadatamanager.search.MetadataValueFieldInfo;
import com.tandbergtv.metadatamanager.search.SearchField;
import com.tandbergtv.metadatamanager.spec.IIdentifier;
import com.tandbergtv.metadatamanager.specimpl.IdentifierBase;
import com.tandbergtv.metadatamanager.specimpl.SingleTitleSpecHandler;

public class OdgOrfSpecHandler extends SingleTitleSpecHandler {

	private static final String VIDEO_ROOTELEMENT_NAME_CLIPS = "importVideoWithClips";
	private static final String VIDEO_ROOTELEMENT_NAME = "importVideo";
	
	public OdgOrfSpecHandler() {
		super();
		this.alias = "OdgOrf";
	}
	
	@Override
	public IIdentifier extractId(Asset asset) {
		OdgOrfIdentifier id = new OdgOrfIdentifier();

		// set search service
		id.setSearchService(getSearchService());

		// set mapping resource
		id.setMappingResourceUrl(getMappingResourceUrl());

		// extract the id values after getting the ttvxpaths for the id fields.
		Map<String, String> idXPaths = id.getTTVPaths();

		Map<String, String> idValues = new HashMap<String, String>();
		Iterator<Entry<String, String>> iter = idXPaths.entrySet().iterator();
		List<String> assetTypes = new ArrayList<String>();
		assetTypes.add("PACKAGE");
		assetTypes.add("TITLE");
		while (iter.hasNext()) {
			Entry<String, String> entry = iter.next();
			List<Field> fields = asset.getAllFieldsForXpath(assetTypes, entry.getValue());
			if(!fields.isEmpty()) {
				if (fields.get(0) != null) {
					idValues.put(entry.getKey(), fields.get(0).getValue());
				}
			}
		}

		// set these values in the id.
		id.setSpecIdentifiers(idValues);
		return id;
	}

	@Override
	public IdentifierBase getIdentifier() {
		OdgOrfIdentifier identifier = new OdgOrfIdentifier();
		identifier.setSearchService(searchService);
		identifier.setMappingResourceUrl(mappingResourceUrl);
		
		return identifier;
	}
	
	@Override
	public String getSpecAlias(Document doc) {
		String name = doc.getDocumentElement().getNodeName();
		if (name.equals(VIDEO_ROOTELEMENT_NAME_CLIPS)
				|| name.equals(VIDEO_ROOTELEMENT_NAME)) {
			return alias;
		}
		return null;
	}

	@Override
	protected boolean requireSpecSpecificMerging(String assetType) {
		return ItemType.TITLE.toString().equalsIgnoreCase(assetType) || 
		GroupType.MOVIE.toString().equalsIgnoreCase(assetType) ||
		GroupType.PREVIEW.toString().equalsIgnoreCase(assetType) || 
		ItemType.POSTER.toString().equalsIgnoreCase(assetType) ||
		ItemType.ENCRYPTED.toString().equalsIgnoreCase(assetType);
	}
	
	@Override
	protected void specSpecificMergingNoSave(Asset newAsset, Relation oldRelation, Asset existingAsset) {
		if (existingAsset.getType().equals(ItemType.TITLE.toString())) {
			super.specSpecificMergingNoSave(newAsset, oldRelation, existingAsset);
		} else if (existingAsset.getType().equals(GroupType.MOVIE.toString()) || 
				existingAsset.getType().equals(GroupType.PREVIEW.toString()) || 
				existingAsset.getType().equals(ItemType.POSTER.toString()) || 
				existingAsset.getType().equals(ItemType.ENCRYPTED.toString())) {
			// assets are always added, no updates supported
			newAsset.addChild(copyAssetTree(existingAsset));
		}
	}
	
	@Override
	public List<SearchField> getSearchFieldsToValidatePersistedCopies(Asset asset) {
		List<SearchField> fields = super.getSearchFieldsToValidatePersistedCopies(asset);
		if (fields != null && !fields.isEmpty()) {
			for (SearchField f : fields) {
				if (f instanceof MetadataValueFieldInfo) {
					((MetadataValueFieldInfo) f).setAssetType(ItemType.TITLE.toString());
				}
			}
		}
		return fields;
	}
}
