using System;
using IRaCIS.Core.Domain.Share;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Collections.Generic;
using System.Linq;
using IRaCIS.Core.Domain.Share.Reading;

namespace IRaCIS.Core.Domain.Models
{
	///<summary>
	/// 项目阅片问题
	///</summary>
	[Table("ReadingQuestionTrial")]
	public class ReadingQuestionTrial : Entity, IAuditAdd
	{

		public bool IsAdditional { get; set; }


        /// <summary>
        /// 项目标准Id
        /// </summary>
        public Guid ReadingQuestionCriterionTrialId { get; set; }

		/// <summary>
		/// 项目Id
		/// </summary>
		public Guid TrialId { get; set; }

		/// <summary>
		/// 类型
		/// </summary>
		public string Type { get; set; } = string.Empty;

        /// <summary>
        /// 父问题触发
        /// </summary>
        public string ParentTriggerValue { get; set; } = string.Empty;

        /// <summary>
        /// 问题名称
        /// </summary>
        public string QuestionName { get; set; } = string.Empty;

        /// <summary>
        /// 是否是必须
        /// </summary>
        public IsRequired IsRequired { get; set; }

		/// <summary>
		/// 排序
		/// </summary>
		public int ShowOrder { get; set; }

		/// <summary>
		/// 父问题ID
		/// </summary>
		public Guid? ParentId { get; set; }


		/// <summary>
		/// 类型值
		/// </summary>
		public string TypeValue { get; set; } = string.Empty;

        public bool IsEnable { get; set; }

		/// <summary>
		/// 是否是裁判问题
		/// </summary>
		public bool IsJudgeQuestion { get; set; }

		/// <summary>
		/// 病灶类型
		/// </summary>
		public LesionType? LesionType { get; set; }

		/// <summary>
		/// 问题类型
		/// </summary>
		public QuestionType? QuestionType { get; set; }

		/// <summary>
		/// 全局阅片显示类型
		/// </summary>
		public GlobalReadingShowType GlobalReadingShowType { get; set; } = GlobalReadingShowType.NotShow;


		/// <summary>
		/// 转化显示类型
		/// </summary>
		public ConvertShowType ConvertShowType { get; set; } = ConvertShowType.All;

		/// <summary>
		/// 备注
		/// </summary>
		public string Remark { get; set; } = string.Empty;

        /// <summary>
        /// 分组
        /// </summary>
        public string GroupName { get; set; } = string.Empty;

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }

		/// <summary>
		/// 系统问题ID
		/// </summary>
		public Guid? ReadingQuestionSystemId { get; set; }

		/// <summary>
		/// 系统标准的ParentId
		/// </summary>
		public Guid? SystemParentId { get; set; }

		/// <summary>
		/// 答案分组
		/// </summary>
		public string AnswerGroup { get; set; } = string.Empty;

		/// <summary>
		/// 答案组合
		/// </summary>
		public string AnswerCombination { get; set; } = string.Empty;

		/// <summary>
		/// 裁判类型
		/// </summary>
		public JudgeTypeEnum JudgeType { get; set; } = JudgeTypeEnum.AnswerDisaffinity;

		/// <summary>
		/// 创建人
		/// </summary>
		public Guid CreateUserId { get; set; }

		/// <summary>
		/// 标准分页Id
		/// </summary>
		public Guid? ReadingCriterionPageId { get; set; }

		/// <summary>
		/// 关联ID
		/// </summary>
		public Guid? RelevanceId { get; set; }

		/// <summary>
		/// 关联Value
		/// </summary>
		public string RelevanceValue { get; set; }=string.Empty;

		/// <summary>
		/// 图片数量
		/// </summary>
		public int ImageCount { get; set; } = 1;

		/// <summary>
		/// 是否显示
		/// </summary>
		public ShowQuestion ShowQuestion { get; set; } = ShowQuestion.Show;

		/// <summary>
		/// 默认值
		/// </summary>
		public string DefaultValue { get; set; } =string.Empty;

		/// <summary>
		/// 最大问题数
		/// </summary>
		public int? MaxQuestionCount { get; set; }

		/// <summary>
		/// 最大答案长度
		/// </summary>
		public int? MaxAnswerLength { get; set; }

		/// <summary>
		/// 文件类型
		/// </summary>
		public string? FileType { get; set; } 

		/// <summary>
		/// 是否显示在Dicom阅片中
		/// </summary>
		public bool IsShowInDicom { get; set; } = false;


		/// <summary>
		/// 序号标记
		/// </summary>
		public string OrderMark { get; set; } = string.Empty;

		/// <summary>
		/// 字典code
		/// </summary>
		public string DictionaryCode { get; set; } = string.Empty;

		/// <summary>
		/// 问题类型
		/// </summary>
		public TableQuestionType? QuestionGenre { get; set; }

		/// <summary>
		/// 数值类型
		/// </summary>
		public ValueOfType? ValueType { get; set; }

		/// <summary>
		/// 单位
		/// </summary>
		public ValueUnit? Unit { get; set; }

		/// <summary>
		/// 自定义单位
		/// </summary>
		public string CustomUnit { get; set; } = string.Empty;


		/// <summary>
		/// 自定义计算标记
		/// </summary>
		public CustomCalculateMark? CustomCalculateMark { get; set; }

		/// <summary>
		/// 限制编辑
		/// </summary>
		public LimitEdit LimitEdit { get; set; } = LimitEdit.None;

		/// <summary>
		/// 限制显示
		/// </summary>
		public LimitShow LimitShow { get; set; } = LimitShow.AllShow;

		/// <summary>
		/// 自定义计算标记
		/// </summary>
		public string CalculateQuestions { get; set; } = "[]";

		/// <summary>
		/// 数据来源
		/// </summary>
		public DataSources DataSource { get; set; } = DataSources.ManualEntry;

		/// <summary>
		/// 问题英文名称
		/// </summary>
		public string QuestionEnName { get; set; } = string.Empty;

		/// <summary>
		/// 问题英文分组
		/// </summary>
		public string GroupEnName { get; set; } = string.Empty;

		/// <summary>
		/// 分类算法
		/// </summary>
		public string ClassifyAlgorithms { get; set; } = string.Empty;

		/// <summary>
		/// 分类问题Id
		/// </summary>
		public Guid? ClassifyQuestionId { get; set; } 

        /// <summary>
        /// 是否复制病灶
        /// </summary>
        public bool IsCopyLesions { get; set; } = false;

		/// <summary>
		/// 分组ID
		/// </summary>
		public Guid? GroupId { get; set; }


		/// <summary>
		/// 分组分类
		/// </summary>
		public GroupClassify? GroupClassify { get; set; }


        /// <summary>
        /// 问题分类
        /// </summary>
        public QuestionClassify? QuestionClassify { get; set; }

        [JsonIgnore]
		[ForeignKey("GroupId")]
		public ReadingQuestionTrial GroupInfo { get; set; }

		/// <summary>
		/// 分页标准
		/// </summary>
		[ForeignKey("ReadingCriterionPageId")]
        [JsonIgnore]
		public ReadingCriterionPage ReadingCriterionPage { get; set; }
		[JsonIgnore]
		[ForeignKey("ParentId")]
		public ReadingQuestionTrial ParentReadingQuestionTrial { get; set; }
		[JsonIgnore]
		[ForeignKey("RelevanceId")]
		public ReadingQuestionTrial RelevanceReadingQuestionTrial { get; set; }
		[JsonIgnore]
		[ForeignKey("ReadingQuestionCriterionTrialId")]
		public ReadingQuestionCriterionTrial ReadingQuestionCriterionTrial { get; set; }

        [JsonIgnore]
        public List<ReadingTableQuestionTrial> ReadingTableQuestionTrialList { get; set; }

      
		[NotMapped]
		public List<string> ParentTriggerValueList
        {
            get
            {
                try
                {
                    return this.ParentTriggerValue.Split(',').ToList();
                }
                catch (Exception)
                {

                    return new List<string>();
                }
            }

        }

		
		[NotMapped]
		public List<string> RelevanceValueList
		{
			get
			{
				try
				{
					return this.RelevanceValue.Split(',').ToList();
				}
				catch (Exception)
				{

					return new List<string>();
				}
			}

		}

	
		[NotMapped]
		public List<CalculateInfo> CalculateQuestionList
		{
			get
			{

				try
				{
					var result = JsonConvert.DeserializeObject<List<CalculateInfo>>(this.CalculateQuestions);
					return result == null ? new List<CalculateInfo>() : result;
				}
				catch (Exception)
				{

					return new List<CalculateInfo>();
				}

			}
		}

	}


	public class CalculateInfo
    {
		public bool IsTable { get; set; }

		public Guid? QuestionId { get; set; }

		public Guid? TableQuestionId { get; set; }

	}



}