package ca.uhn.fhir.parser;

import org.hl7.fhir.dstu2016may.model.DateTimeType;
import org.hl7.fhir.dstu2016may.model.DomainResource;
import org.hl7.fhir.dstu2016may.model.ResourceType;
import org.hl7.fhir.dstu2016may.model.Type;
import org.hl7.fhir.instance.model.api.ICompositeType;

import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.DatatypeDef;
import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.util.ElementUtil;

/**
 * This is an example of a custom resource that also uses a custom
 * datatype.
 * 
 * See #364
 */
@ResourceDef(name = "CustomResource", profile = "http://hl7.org/fhir/profiles/custom-resource", id = "custom-resource")
public class CustomResource364Dstu21 extends DomainResource {

	private static final long serialVersionUID = 1L;

	@Child(name = "baseValue", min = 1, max = Child.MAX_UNLIMITED, type= {})
	private Type baseValues;

	public Type getBaseValues() {
		return baseValues;
	}


	@Override
	public FhirVersionEnum getStructureFhirVersionEnum() {
		return FhirVersionEnum.DSTU2_1;
	}

	@Override
	public boolean isEmpty() {
		return ElementUtil.isEmpty(baseValues);
	}

	public void setBaseValues(Type theValue) {
		this.baseValues = theValue;
	}

	@DatatypeDef(name="CustomDate")
	public static class CustomResource364CustomDate extends Type implements ICompositeType {

		private static final long serialVersionUID = 1L;
		
		@Child(name = "date", order = 0, min = 1, max = 1, type = { DateTimeDt.class })
		private DateTimeType date;


		public DateTimeType getDate() {
			if (date == null)
				date = new DateTimeType();
			return date;
		}

		@Override
		public boolean isEmpty() {
			return ElementUtil.isEmpty(date);
		}

		public CustomResource364CustomDate setDate(DateTimeType theValue) {
			date = theValue;
			return this;
		}

		@Override
		protected CustomResource364CustomDate typedCopy() {
			CustomResource364CustomDate retVal = new CustomResource364CustomDate();
			super.copyValues(retVal);
			retVal.date = date;
			return retVal;
		}
	}

	@Override
	public CustomResource364Dstu21 copy() {
		CustomResource364Dstu21 retVal = new CustomResource364Dstu21();
		super.copyValues(retVal);
		retVal.baseValues = baseValues;
		return retVal;
	}


	@Override
	public ResourceType getResourceType() {
		return null;
	}

}