package eu.dnetlib.enabling.database.objects;

import java.io.Serializable;
import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity(name = "dnet_databases")
@Table(name = "dnet_databases")
public class DnetDatabase implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7003492091751187313L;

	private static final String PREFIX_TEMPORARY_ID = "temporary_id_";
		
	public static final String DATABASE_RESOURCE_TYPE = "DatabaseDSResourceType";

	@Id
	@Column(name = "db_name")
	private String dbName;

	@Column(name = "resource_id", unique=true)
	private String resourceId;

	@Column(name = "date_creation")
	private String dateOfCreation;

	@Column(name = "managed", nullable=false)
	private boolean managed = true;

	public DnetDatabase() {}

	public DnetDatabase(String dbName) {
		this(dbName, true);
	}

	public DnetDatabase(String dbName, Boolean managed) {
		super();
		this.dbName = dbName;
		this.resourceId = PREFIX_TEMPORARY_ID + UUID.randomUUID();
		this.dateOfCreation = "2010-01-01T00:00:00+01:00";

		if (managed != null) {
			this.managed = managed;
		}
	}

/*
	public String asProfile(VelocityEngine velocityEngine, String uri, Map<String, TableDates> tableDates) throws DatabaseException {
		if (tableDates != null && !tableDates.isEmpty()) { 
			for (DnetTable t : tables) {
				if (tableDates.containsKey(t.getName())) {
					TableDates dates = tableDates.get(t.getName());
					t.setLastInsertDate(dates.getLastInsert());
					t.setLastUpdateDate(dates.getLastUpdate());
					t.setLastDeleteDate(dates.getLastDelete());
				}
			}
		}
		
		try {
			Map<String, Object>  map = new HashMap<String, Object>();
			map.put("db", this);
			map.put("tables", tables);
			map.put("date", DateUtils.now_ISO8601());
			map.put("uri", uri);
			
			return VelocityEngineUtils.mergeTemplateIntoString(
					velocityEngine, 
					"eu/dnetlib/enabling/database/velocity/DatabaseDS.xml.vm", 
					map);
		} catch (Exception e) {
			log.error("Error generating profile of database " + dbName , e);
			throw new DatabaseException("Error generating profile of database " + dbName, e);
		}
	}
	*/

	public void setManaged(boolean managed) {
		this.managed = managed;
	}

	public String getDbName() {
		return dbName;
	}

	public void setDbName(String dbName) {
		this.dbName = dbName;
	}

	public String getResourceId() {
		return resourceId;
	}

	public void setResourceId(String resourceId) {
		this.resourceId = resourceId;
	}

	public String getDateOfCreation() {
		return dateOfCreation;
	}

	public void setDateOfCreation(String dateOfCreation) {
		this.dateOfCreation = dateOfCreation;
	}

	public boolean isManaged() {
		return managed;
	}

	public boolean isRegistered() {
		if (resourceId == null) return false;
		if (resourceId.isEmpty()) return false;
		if (resourceId.startsWith(PREFIX_TEMPORARY_ID)) return false;
		return true;
	}
	
}
