package org.purl.wf4ever.robundle.manifest;

import java.net.URI;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder(value = { "uri", "about", "content" })
public class PathAnnotation {
	private List<URI> about = new ArrayList<>();
	private URI content;
	private URI uri;

	public void generateAnnotationId() {
		setUri(URI.create("urn:uuid:" + UUID.randomUUID()));
	}

	@JsonIgnore
	public URI getAbout() {
		if (about.isEmpty()) {
			return null;
		} else {
			return about.get(0);
		}
	}

	@JsonIgnore
	public List<URI> getAboutList() {
		return about;
	}

	@JsonProperty("about")
	public Object getAboutObject() {
		if (about.isEmpty()) {
			return null;
		}
		if (about.size() == 1) {
			return about.get(0);
		} else {
			return about;
		}
	}

	@Deprecated
	public URI getAnnotion() {
		return getUri();
	}

	public URI getContent() {
		return content;
	}

	public URI getUri() {
		return uri;
	}

	private URI relativizePath(Path path) {
		return URI.create("/.ro/").relativize(
				URI.create(path.toUri().getRawPath()));
	}

	public void setAbout(List<URI> about) {
		if (about == null) {
			throw new NullPointerException("about list can't be null");
		}
		this.about = about;
	}

	public void setAbout(Path path) {
		setAbout(relativizePath(path));
	}

	public void setAbout(URI about) {
		this.about.clear();
		if (about != null) {
			this.about.add(about);
		}
	}

	@Deprecated
	public void setAnnotation(URI annotation) {
		setUri(annotation);
	}

	public void setContent(Path path) {
		this.content = relativizePath(path);
	}

	public void setContent(URI content) {
		this.content = content;
	}

	public void setUri(URI uri) {
		this.uri = uri;
	}

	@Override
	public String toString() {
		return "Annotation: " + getContent() + " about " + getAbout();
	}
}
