package org.opencds.cqf.r4.builders;

import org.opencds.cqf.common.builders.BaseBuilder;
import org.hl7.fhir.r4.model.Enumerations;
import org.hl7.fhir.r4.model.StructureMap;

import java.util.UUID;

public class StructuredMapBuilder extends BaseBuilder<StructureMap> {

    public StructuredMapBuilder() {
        super(new StructureMap());
    }

    public StructuredMapBuilder(StructureMap activityDefinition ) {
        super(activityDefinition);
    }

    public StructuredMapBuilder buildUrl(String url) {
        complexProperty.setUrl(UUID.randomUUID().toString());
        return this;
    }
    public StructuredMapBuilder buildRandomUrl() {
        return buildUrl("urn:uuid:" + UUID.randomUUID().toString());
    }

    public StructuredMapBuilder buildName(String name) {
        complexProperty.setName(name);
        return this;
    }

    public StructuredMapBuilder buildStatus(Enumerations.PublicationStatus publicationStatus) {
        complexProperty.setStatus(publicationStatus);
        return this;
    }

    public StructuredMapBuilder buildPublisher(String publisher) {
        complexProperty.setPublisher(publisher);
        return this;
    }

    public StructuredMapBuilder buildGroup(StructureMap.StructureMapGroupComponent group) {
        complexProperty.addGroup(group);
        return this;
    }

    public StructuredMapBuilder buildStructure(StructureMap.StructureMapStructureComponent structure) {
        complexProperty.addStructure(structure);
        return this;
    }

    public StructuredMapBuilder buildStructure(StructureMap.StructureMapModelMode mode, String fhirType) {
        StructureMap.StructureMapStructureComponent structureMapStructureComponent = new StructureMap.StructureMapStructureComponent();
        structureMapStructureComponent.setMode(mode);
        structureMapStructureComponent.setUrl("http://hl7.org/fhir/StructureDefinition/" + fhirType.toLowerCase());
        complexProperty.addStructure(structureMapStructureComponent);
        return this;
    }

    public StructuredMapBuilder buildStructureTarget(String fhirType) {
        return buildStructure(StructureMap.StructureMapModelMode.TARGET, fhirType);
    }

    public StructuredMapBuilder buildStructureSource(String fhirType) {
        return buildStructure(StructureMap.StructureMapModelMode.SOURCE, fhirType);
    }

    public StructuredMapBuilder buildDescription(String description) {
        complexProperty.setDescription(description);
        return this;
    }
}