package com.ejie.ab61.tramita.helper;

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

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ab61.clientesWS.pid.ObjectFactory;
import com.ejie.ab61.clientesWS.pid.W43DfAttribute;
import com.ejie.ab61.clientesWS.pid.W43DfContent;
import com.ejie.ab61.clientesWS.pid.W43DfCore;
import com.ejie.ab61.clientesWS.pid.W43DfDocument;
import com.ejie.ab61.clientesWS.pid.W43DfFormat;
import com.ejie.ab61.clientesWS.pid.W43DfGETContent;
import com.ejie.ab61.clientesWS.pid.W43DfGETDocument;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.model.documento.Documento;
import com.ejie.ab61.model.documento.Documento.Tipologia;

/**
 * PidAdapterServiceImpl Contiene metodos para crear los parametros de envio en
 * las llamadas a los WebServices de PID
 *
 *  
 */
public final class PidHelper {

	private static final Logger logger = LoggerFactory.getLogger(PidHelper.class);

	/**
	 * Constructor
	 */
	private PidHelper() {
		super();
	}

	/**
	 * crearW43DfDocument Crea el objeto W43DfDocument
	 *
	 * @param documento
	 *            Documento
	 * @return W43DfDocument
	 */
	public static W43DfDocument crearW43DfDocument(Documento documento) {
		ObjectFactory objectFactory = new ObjectFactory();
		W43DfDocument w43DfDocument = objectFactory.createW43DfDocument();
		// Identificador PID:
		if (!StringUtils.isEmpty(documento.getIdPID())) {
			w43DfDocument.setId(documento.getIdPID());
		}
		// Tipo Documental:
		if (documento.getTipologia() != null) {
			w43DfDocument.setType(documento.getTipologia().getName());
		}
		// Metadatos Inicio:
		// Metadato object_name:
		if (!StringUtils.isEmpty(documento.getNombre())) {
			W43DfAttribute w43DfAttributeObjecName = objectFactory.createW43DfAttribute();
			w43DfAttributeObjecName.setKey(Constantes.PIDTurismo.Metadata.OBJECTNAME);
			w43DfAttributeObjecName.getValues().add(documento.getNombreFichero());
			w43DfDocument.getAttributes().add(w43DfAttributeObjecName);
		}
		// Metadatos de la Tipologia
		if (documento.getMetadatos() != null && documento.getMetadatos().size() > 0) {
			for (Entry<String, ArrayList<String>> entry : documento.getMetadatos().entrySet()) {
				W43DfAttribute w43DfAttribute = objectFactory.createW43DfAttribute();
				w43DfAttribute.setKey(entry.getKey());
				List<String> values = entry.getValue();
				if (values != null && !values.isEmpty()) {
					for (String value : values) {
						w43DfAttribute.getValues().add(value);
					}
				}
				w43DfDocument.getAttributes().add(w43DfAttribute);
			}
		}
		// Metadatos Fin
		// Contenido Inicio:
		W43DfContent w43DfContent = objectFactory.createW43DfContent();
		if (!StringUtils.isEmpty(documento.getPathPIF())) {
			w43DfContent.setPath(documento.getPathPIF());
		} else if (documento.getBytes() != null) {
			w43DfContent.setBytes(documento.getBytes());
		}
		W43DfFormat w43DfFormat = objectFactory.createW43DfFormat();
		if (!StringUtils.isEmpty(documento.getDescripcionFormato())) {
			w43DfFormat.setDescription(documento.getDescripcionFormato());
		}
		if (!StringUtils.isEmpty(documento.getNombre())) {
			w43DfFormat.setExtension(documento.getExtensionFichero());
		}
		w43DfContent.setFormat(w43DfFormat);
		w43DfDocument.setContent(w43DfContent);
		// Contenido Fin
		if (documento.getTipologia() != null) {
			W43DfCore w43DfCore = configureW43DfCore(documento.getTipologia());
			if (w43DfCore != null) {
				w43DfDocument.setCore(w43DfCore);
			}
		}
		return w43DfDocument;
	}

	/**
	 * crearW43DfGetDocument Crea el objeto W43DfGETDocument
	 *
	 * @param documento
	 *            Documento
	 * @return W43DfGETDocument
	 */
	public static W43DfGETDocument crearW43DfGetDocument(Documento documento) {
		ObjectFactory objectFactory = new ObjectFactory();
		W43DfGETDocument w43DfGETDocument = objectFactory.createW43DfGETDocument();
		w43DfGETDocument.setId(documento.getIdPID());
		if (!StringUtils.isEmpty(documento.getPathPIF())) {
			W43DfGETContent w43DfGETContent = objectFactory.createW43DfGETContent();
			w43DfGETContent.setPath(documento.getPathPIF());
			w43DfGETDocument.setContent(w43DfGETContent);
		}
		// Recuperamos siempre todos los metadatos
		if (documento.getTipologia() != null) {
			if (Tipologia.INICIATIVA_TURISMO.equals(documento.getTipologia())) {
				w43DfGETDocument.getKeys().addAll(Constantes.PIDTurismo.Metadata.ALL);
			}
		}
		return w43DfGETDocument;
	}

	/**
	 * configureW43DfCore Crea el objeto W43DfCore en base a la Tipologia del
	 * documento
	 *
	 * @param tipologia
	 *            Tipologia
	 * @return W43DfCore
	 */
	private static W43DfCore configureW43DfCore(Tipologia tipologia) {
		W43DfCore w43DfCore = null;
		switch (tipologia) {
		case INICIATIVA_TURISMO:
			// Owner: Al no poner nada sera ab61, Acl: Al no poner nada sera la
			// ACL de ab61 -> pid_acl_gesrectur, Filestore: Al no poner nada
			// sera el area por defecto -> pid_filestore_gesrectur_01
			PidHelper.logger.info(
					"configureW43DfCore -> Owner: ab61, Acl: pid_acl_gesrectur, Filestore: pid_filestore_gesrectur_01");
			return w43DfCore;
		default:
			return w43DfCore;
		}
	}
}
