package com.cirle.scientific.questionnaire.entity;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Set;

/**
 * 问卷问题实体类
 */
@Getter
@Setter
@Entity
@Table(name = "questionnaire_question")
@SQLDelete(sql = "UPDATE questionnaire_question SET deleted = true WHERE id=?")
@Where(clause = "deleted=false")
public class QuestionEntity {

    // ID：实体的唯一标识，不建议用于业务用途
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    @NotNull
    private String id;

    // 问题所属的组
    @ManyToOne
    @JoinColumn(name = "group_id")
    @NotNull
    private QuestionGroupEntity questionGroupEntity;

    // 问题标签（通常为题号）
    private String label;

    // 问题文本（即题干）
    @NotNull
    private String text;

    // 问题类型
    @NotNull
    private Type type;

    // 必填标志（当该值为True时，必须提供该问题的答案；默认值为False）
    @NotNull
    private Boolean required = Boolean.FALSE;

    // 问题下的所有选项（仅问题类型为判断题、单选题、多选题时该字段才有意义）
    @OneToMany(mappedBy = "questionEntity", fetch = FetchType.EAGER)
    private Set<QuestionOptionEntity> questionOptionEntities;

    // 逻辑删除标识（默认值为False）
    @NotNull
    private Boolean deleted = Boolean.FALSE;

    /**
     * 问题类型枚举类
     */
    public enum Type {

        /**
         * 判断题
         */
        TRUE_FALSE,

        /**
         * 单选题
         */
        SINGLE_CHOICE,

        /**
         * 多选题
         */
        MULTIPLE_CHOICE,

        /**
         * 问答题
         */
        Q_AND_A

    }
}
