package eu.dnetlib.enabling.datastructures;

import com.google.gson.Gson;

import eu.dnetlib.enabling.annotations.DnetResource;
import eu.dnetlib.enabling.utils.DnetAnnotationUtils;
import eu.dnetlib.rmi.objects.is.DnetDataStructure;
import eu.dnetlib.rmi.soap.exceptions.InformationServiceException;

public abstract class AbstractJsonResource implements BaseResource {

	private String code;
	private boolean valid = true;
	private String name;
	private String description;

	public final String getCode() {
		return code;
	}

	public final void setCode(final String code) {
		this.code = code;
	}

	public final boolean isValid() {
		return valid;
	}

	public final void setValid(final boolean valid) {
		this.valid = valid;
	}

	public final String getName() {
		return name;
	}

	public final void setName(final String name) {
		this.name = name;
	}

	public final String getDescription() {
		return description;
	}

	public final void setDescription(final String description) {
		this.description = description;
	}

	@Override
	public final DnetDataStructure asDnetDataStructure() throws InformationServiceException {
		if (getClass().isAnnotationPresent(DnetResource.class)) {
			final DnetDataStructure ds = new DnetDataStructure();
			ds.setCode(code);
			ds.setType(getClass().getAnnotation(DnetResource.class).type());
			ds.setValid(valid);
			ds.setName(name);
			ds.setDescription(description);
			ds.setContent(new Gson().toJson(this));
			ds.setProperties(DnetAnnotationUtils.getIndexedFields(this));
			return ds;
		} else {
			throw new InformationServiceException("Missing DnetResource annotation in class " + getClass());
		}
	}

}
