package uk.nhs.careconnect.ri.database.entity.questionnaire;


import org.hl7.fhir.dstu3.model.Enumerations;
import uk.nhs.careconnect.ri.database.entity.BaseResource;
import uk.nhs.careconnect.ri.database.entity.codeSystem.ConceptEntity;

import javax.persistence.*;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "Questionnaire",
        indexes = {

        })
public class QuestionnaireEntity extends BaseResource {

    private static final int MAX_DESC_LENGTH = 4096;

    public enum QuestionnaireType  { component, valueQuantity }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="QUESTIONNAIRE_ID")
    private Long id;

    @Column(name = "URL")
    private String url;

    @OneToMany(mappedBy="questionnaire", targetEntity=QuestionnaireIdentifier.class)
    private Set<QuestionnaireIdentifier> identifiers = new HashSet<>();

    @Enumerated(EnumType.ORDINAL)
    @Column(name="status")
    private Enumerations.PublicationStatus status;

    @Column(name="VERSION",length = MAX_DESC_LENGTH,nullable = true)
    private String version;

    @Column(name="NAME",length = MAX_DESC_LENGTH,nullable = true)
    private String name;

    @Column(name="TITLE",length = MAX_DESC_LENGTH,nullable = true)
    private String title;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "DATETIME")
    private Date dateTime;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "APPROVAL_DATETIME")
    private Date approvalDateTime;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "LAST_REVIEW_DATETIME")
    private Date lastReviewDateTime;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="CODE_CONCEPT_ID",nullable = true,foreignKey= @ForeignKey(name="FK_QUESTIONNAIRE_CODE_CONCEPT_ID"))
    private ConceptEntity questionnaireCode;

    @Column(name = "SUBJECT_RESOURCE_TYPE")
    private String subjectType;

    @Column(name = "PURPOSE", length = MAX_DESC_LENGTH)
    private String purpose;

    @Column(name = "PUBLISHER")
    private String publisher;

    @Column(name = "COPYRIGHT")
    private String copyright;

    @Column(name = "DESCRIPTION", length = MAX_DESC_LENGTH)
    private String description;

    @OneToMany(mappedBy="questionnaire", targetEntity=QuestionnaireItem.class)
    @OrderBy(value = "itemId ASC")
    private Set<QuestionnaireItem> items = new HashSet<>();

    public Set<QuestionnaireItem> getItems() {
        return items;
    }

    public void setItems(Set<QuestionnaireItem> items) {
        this.items = items;
    }

    public Enumerations.PublicationStatus getStatus() {
        return status;
    }

    public void setStatus(Enumerations.PublicationStatus status) {
        this.status = status;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getDateTime() {
        return dateTime;
    }

    public void setDateTime(Date dateTime) {
        this.dateTime = dateTime;
    }

    public Date getApprovalDateTime() {
        return approvalDateTime;
    }

    public void setApprovalDateTime(Date approvalDateTime) {
        this.approvalDateTime = approvalDateTime;
    }

    public Date getLastReviewDateTime() {
        return lastReviewDateTime;
    }

    public void setLastReviewDateTime(Date lastReviewDateTime) {
        this.lastReviewDateTime = lastReviewDateTime;
    }

    public ConceptEntity getQuestionnaireCode() {
        return questionnaireCode;
    }

    public void setQuestionnaireCode(ConceptEntity questionnaireCode) {
        this.questionnaireCode = questionnaireCode;
    }

    public String getSubjectType() {
        return subjectType;
    }

    public void setSubjectType(String subjectType) {
        this.subjectType = subjectType;
    }

    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }



    public Set<QuestionnaireIdentifier> getIdentifiers() {
        if (identifiers == null) { identifiers = new HashSet<QuestionnaireIdentifier>(); }
        return identifiers;
    }



    public QuestionnaireEntity setIdentifiers(Set<QuestionnaireIdentifier> identifiers) {
        this.identifiers = identifiers;
        return this;
    }


    public static int getMaxDescLength() {
        return MAX_DESC_LENGTH;
    }

    public String getPurpose() {
        return purpose;
    }

    public void setPurpose(String purpose) {
        this.purpose = purpose;
    }

    public String getDescription() {
        return description;
    }

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getCopyright() {
        return copyright;
    }

    public void setCopyright(String copyright) {
        this.copyright = copyright;
    }
}