package com.ejie.ab61.model.documento;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FilenameUtils;

/**
 * Clase que contiene la informaciÃ³n de un documento.
 *
 *  
 */
public class Documento {

	/** Identificador del documento en el PID (oid) */
	private String idPID;

	/** TamaÃ±o del documento. */
	private long length;

	/** Contenido del documento. */
	private byte[] bytes;

	/** UbicaciÃ³n documento en el fileSystem del PIF. */
	private String pathPIF;

	/** Nombre. documento.pdf */
	private String nombre;

	/** DescripciÃ³n del archivo */
	private String descripcion;

	/** DescripciÃ³n del formato del archivo */
	private String descripcionFormato;

	/** Tipo de contenido. */
	private String contentType;

	/** Tipo de multimedia: documento, imagen, video, ... */
	private Integer tipoMultimedia;

	/** DescripciÃ³n del archivo */
	private Map<String, ArrayList<String>> metadatos;

	private Tipologia tipologia;

	/**
	 * Constructor por defecto
	 */
	public Documento() {
		// Constructor vacio
	}

	/**
	 * Constructor
	 *
	 * @param nombre
	 *            Nombre del documento
	 * @param contentType
	 *            Tipo del documento
	 */
	public Documento(String nombre, String contentType) {
		this.nombre = nombre;
		this.contentType = contentType;
	}

	/**
	 * Obtiene el campo length
	 * 
	 * @return length
	 */
	public long getLength() {
		return this.length;
	}

	/**
	 * Establece el campo length
	 * 
	 * @param length
	 *            length
	 */
	public void setLength(long length) {
		this.length = length;
	}

	/**
	 * Obtiene el campo bytes
	 * 
	 * @return bytes
	 */
	public byte[] getBytes() {
		return this.bytes;
	}

	/**
	 * Establece el campo bytes
	 * 
	 * @param bytes
	 *            bytes
	 */
	public void setBytes(byte[] bytes) {
		this.bytes = bytes;
	}

	/**
	 * Obtiene el campo nombre
	 * 
	 * @return nombre
	 */
	public String getNombre() {
		return this.nombre;
	}

	/**
	 * Establece el campo nombre
	 * 
	 * @param nombre
	 *            nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Obtiene el campo contentType
	 * 
	 * @return contentType
	 */
	public String getContentType() {
		return this.contentType;
	}

	/**
	 * Establece el campo contentType
	 * 
	 * @param contentType
	 *            contentType
	 */
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	/**
	 * Obtiene el campo descripcion
	 * 
	 * @return descripcion
	 */
	public String getDescripcion() {
		return this.descripcion;
	}

	/**
	 * Establece el campo descripcion
	 * 
	 * @param descripcion
	 *            descripcion
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getNombreFichero() {
		return FilenameUtils.getBaseName(this.nombre);
	}

	public String getExtensionFichero() {
		return FilenameUtils.getExtension(this.nombre);
	}

	/**
	 * Obtiene el campo tipoMultimedia
	 * 
	 * @return tipoMultimedia
	 */
	public Integer getTipoMultimedia() {
		return this.tipoMultimedia;
	}

	/**
	 * Establece el campo tipoMultimedia
	 * 
	 * @param tipoMultimedia
	 *            tipoMultimedia
	 */
	public void setTipoMultimedia(Integer tipoMultimedia) {
		this.tipoMultimedia = tipoMultimedia;
	}

	/**
	 * Obtiene el campo metadatos
	 * 
	 * @return metadatos
	 */
	public Map<String, ArrayList<String>> getMetadatos() {
		if (metadatos == null) {
			metadatos = new HashMap<String, ArrayList<String>>();
		}
		return this.metadatos;
	}

	/**
	 * Establece el campo metadatos
	 * 
	 * @param metadatos
	 *            metadatos
	 */
	public void setMetadatos(Map<String, ArrayList<String>> metadatos) {
		this.metadatos = metadatos;
	}

	/**
	 * Obtiene el campo pathPIF
	 * 
	 * @return pathPIF
	 */
	public String getPathPIF() {
		return this.pathPIF;
	}

	/**
	 * Establece el campo pathPIF
	 * 
	 * @param pathPIF
	 *            pathPIF
	 */
	public void setPathPIF(String pathPIF) {
		this.pathPIF = pathPIF;
	}

	/**
	 * Obtiene el campo tipologia
	 * 
	 * @return tipologia
	 */
	public Tipologia getTipologia() {
		return this.tipologia;
	}

	/**
	 * Establece el campo tipologia
	 * 
	 * @param tipologia
	 *            tipologia
	 */
	public void setTipologia(Tipologia tipologia) {
		this.tipologia = tipologia;
	}

	/**
	 * Obtiene el campo idPID
	 * 
	 * @return idPID
	 */
	public String getIdPID() {
		return this.idPID;
	}

	/**
	 * Establece el campo idPID
	 * 
	 * @param idPID
	 *            idPID
	 */
	public void setIdPID(String idPID) {
		this.idPID = idPID;
	}

	/**
	 * Obtiene el campo descripcionFormato
	 * 
	 * @return descripcionFormato
	 */
	public String getDescripcionFormato() {
		return this.descripcionFormato;
	}

	/**
	 * Establece el campo descripcionFormato
	 * 
	 * @param descripcionFormato
	 *            descripcionFormato
	 */
	public void setDescripcionFormato(String descripcionFormato) {
		this.descripcionFormato = descripcionFormato;
	}

	/**
	 * Enumeracion para la tipologia de documentos
	 */
	public enum Tipologia {
		INICIATIVA_TURISMO("pid_d_turismo");

		private String name;

		/**
		 *
		 * @param name
		 *            string
		 */
		Tipologia(String name) {
			this.name = name;
		}

		/**
		 *
		 * @return String
		 */
		public String getName() {
			return name;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Documento [idPID=" + this.idPID + ", length=" + this.length + ", bytes=" + Arrays.toString(this.bytes)
				+ ", pathPIF=" + this.pathPIF + ", nombre=" + this.nombre + ", descripcion=" + this.descripcion
				+ ", descripcionFormato=" + this.descripcionFormato + ", contentType=" + this.contentType
				+ ", tipoMultimedia=" + this.tipoMultimedia + ", metadatos=" + this.metadatos + ", tipologia="
				+ this.tipologia + "]";
	}

}
