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

namespace IRaCIS.Core.Domain.Models
{
    [Table("SubjectVisit")]
    public class SubjectVisit : Entity, IAuditUpdate, IAuditAdd, ISoftDelete
    {
        //一个访视  对应有对应Site的  TrialSiteCode   所以 fluentApi中配置  TrialSite  连表用TrialId  SiteId  双字段
        [JsonIgnore]
        public TrialSite TrialSite { get; set; }
        public Guid TrialId { get; set; }
        public Guid SubjectId { get; set; }
        public Guid SiteId { get; set; }

        [JsonIgnore]
        public VisitStage VisitStage { get; set; }
        public Guid? VisitStageId { get; set; }
        public int VisitDay { get; set; }
        public string VisitName { get; set; } = string.Empty;
        public int VisitWindowLeft { get; set; }
        public int VisitWindowRight { get; set; }

        [Column(TypeName = "decimal(18,1)")]
        public decimal VisitNum { get; set; }
        //public string AnonymousVisitName { get; set; } = string.Empty;
        public string BlindName { get; set; } = string.Empty;



        public string SVUPDES { get; set; } = string.Empty;
        public DateTime? SVSTDTC { get; set; }
        public DateTime? SVENDTC { get; set; }
        public bool InPlan { get; set; } = true;
        public bool IsBaseLine { get; set; } = false;


        //0 未执行  1 执行了  2 不可用
        public VisitExecutedEnum VisitExecuted { get; set; } = VisitExecutedEnum.UnExecuted;

        public DateTime? EarliestScanDate { get; set; }

        public DateTime? LatestScanDate { get; set; }

        public Guid CreateUserId { get; set; }
        public DateTime CreateTime { get; set; }
        public Guid UpdateUserId { get; set; }
        public DateTime UpdateTime { get; set; }

        public Guid? Auditor { get; set; }
        

        //public SubjectVisitStateEnum VisitState { get; set; }

        //核查状态
        public CheckStateEnum CheckState { get; set; }

        //提交状态
        public SubmitStateEnum SubmitState { get; set; }
        //审核状态
        public AuditStateEnum AuditState { get; set; }
        public ForwardStateEnum ForwardState { get; set; }

        /// <summary>
        /// 单审通过人
        /// </summary>
        public Guid? PreliminaryAuditUserId { get; set; }

        /// <summary>
        /// 双审通过人
        /// </summary>
        public Guid? ReviewAuditUserId { get; set; }

        /// <summary>
        /// 一致性核查人Id
        /// </summary>
        public Guid? CheckUserId { get; set; }

        public DateTime? ReviewAuditTime { get; set; }
        public DateTime? PreliminaryAuditTime { get; set; }
        public Guid? ForwardUserId { get; set; }
        public DateTime? ForwardTime { get; set; }
        public Guid? CurrentActionUserId { get; set; }
        public DateTime? CurrentActionUserExpireTime { get; set; }

        public DateTime? SubmitTime { get; set; }
        public DateTime? CheckTime { get; set; }

        /// <summary>
        /// 通过原因
        /// </summary>
        public string ManualPassReason { get; set; }

        public bool IsUrgent { get; set; }

        public bool IsTake { get; set; }

        public bool IsFinalVisit { get; set; }

        public ChallengeStateEnum ChallengeState { get; set; }

        public string CheckResult { get; set; } = String.Empty;

        //是否一致性核查回退
        public bool? IsCheckBack { get; set; }

        public DateTime? CheckBackTime { get; set; }

        public CheckChanllengeTypeEnum CheckChallengeState { get; set; }
        public PDStateEnum PDState { get; set; } = PDStateEnum.None;

        //public bool IsOutEnromentVisit { get; set; } = false;

        public DateTime? CheckPassedTime { get; set; }

        /// <summary>
        /// 上一访视
        /// </summary>
        public Guid? OutPlanPreviousVisitId { get; set; }

        [JsonIgnore]
        [ForeignKey("OutPlanPreviousVisitId")]
        public SubjectVisit OutPlanPreviousVisit { get; set; }

        //public Guid? ClinicalDataSignUserId { get; set; }

        //public DateTime? ClinicalDataSignTime { get; set; }

        [JsonIgnore]
        [ForeignKey("ClinicalDataSignUserId")]
        public User ClinicalDataSignUser { get; set; }

        [ForeignKey("ForwardUserId")]
        public User ForwardUser { get; set; }


        [JsonIgnore]
        [ForeignKey("PreliminaryAuditUserId")]
        public User PreliminaryAuditUser { get; set; }

        [JsonIgnore]
        [ForeignKey("ReviewAuditUserId")]
        public User ReviewAuditUser { get; set; }

        [JsonIgnore]
        [ForeignKey("CurrentActionUserId")]
        public User CurrentActionUser { get; set; }

        public RequestBackStateEnum RequestBackState { get; set; }


        public bool IsQCConfirmedReupload { get; set; }

        public bool IsLostVisit { get; set; }


        //是否确认了、签名了 临床数据完整性
        public bool? IsConfirmedClinicalData { get; set; }


        public bool IsEnrollmentConfirm { get; set; }

        public bool IsVisitTaskGenerated { get; set; }

        public bool IsPMBackOrReReading { get; set; }

        /// <summary>
        /// 关闭一致性质疑原因
        /// </summary>
        public string CloseTheReason { get; set; }


        public bool IsDeleted { get; set; }
        public DateTime? DeletedTime { get; set; }

        public Guid? DeleteUserId { get; set; }


        public Guid? SubmitUserId { get; set; }

        [JsonIgnore]
        [ForeignKey("SubmitUserId")]
        public User SubmitUser { get; set; }

        //导航属性
        [JsonIgnore]
        [ForeignKey("TrialId")]
        public Trial Trial { get; set; }

        [JsonIgnore]
        [ForeignKey("SiteId")]
        public Site Site { get; set; }

        [JsonIgnore]
        [ForeignKey("SubjectId")]
        public Subject Subject { get; set; }


        //// 一个访视可以被多个参与者 查看
        //public List<TrialUser> TrialUsers { get; set; }

        ////一个访视 对应该Site下的多个CRC管理   必须加这个  不然生成的sql 会报 TrialSiteUserId  不存在该列名

        //public List<TrialSiteUser> TrialSiteUserList { get; set; }
        [JsonIgnore]
        public List<PreviousHistory> PreviousHistoryList { get; set; }
        [JsonIgnore]
        public List<PreviousOther> PreviousOtherList { get; set; }
        [JsonIgnore]
        public List<PreviousSurgery> PreviousSurgeryList { get; set; }
        [JsonIgnore]
        public List<PreviousPDF> PreviousPDFList { get; set; }
        [JsonIgnore]
        public List<ReadingClinicalData> ReadingClinicalDataList { get; set; }
        [JsonIgnore]
        public List<CheckChallengeDialog> CheckChallengeDialogList { get; set; } = new List<CheckChallengeDialog>();
        [JsonIgnore]
        public List<DicomStudy> StudyList { get; set; } = new List<DicomStudy>();
        [JsonIgnore]
        public List<NoneDicomStudy> NoneDicomStudyList { get; set; } = new List<NoneDicomStudy>();

        [JsonIgnore]
        public List<QCChallenge> QCChallengeList { get; set; } = new List<QCChallenge>();
        [JsonIgnore]
        public List<QCChallengeDialog> QCChallengeDialogList { get; set; } = new List<QCChallengeDialog>();
        [JsonIgnore]
        public List<VisitTask> VisitTaskList { get; set; } = new List<VisitTask>();

        public ReadingStatusEnum ReadingStatus { get; set; }


    }
}