using Castle.Core.Internal;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.DTO;
using IRaCIS.Core.Domain.Share;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IRaCIS.Core.Application.Service.Inspection.DTO
{




    public class DataInspectionAddDTO
    {

        public Guid? TrialId { get; set; }
        public Guid? SiteId { get; set; }
        public Guid? SubjectId { get; set; }
        public Guid? SubjectVisitId { get; set; }
        public string ModuleType { get; set; } = string.Empty;
        public string OptType { get; set; } = string.Empty;



        public string BlindName { get; set; } = string.Empty;
        public string Reason { get; set; } = string.Empty;


        /// <summary>
        /// 子类
        /// </summary>
        public string ChildrenType { get; set; } = string.Empty;
        public bool IsSign { get; set; }
        public string JsonDetail { get; set; } = string.Empty;

        /// <summary>
        /// 创建人名称
        /// </summary>
        public string CreateUserName { get; set; } = string.Empty;

        /// <summary>
        /// 项目名称
        /// </summary>
        public string TrialName { get; set; } = string.Empty;

        /// <summary>
        /// 中心名称
        /// </summary>
        public string SiteName { get; set; } = string.Empty;

        /// <summary>
        /// 受试者Code
        /// </summary>
        public string SubjectCode { get; set; } = string.Empty;

        /// <summary>
        /// 访视名称
        /// </summary>
        public string SubjectVisitName { get; set; } = string.Empty;

        /// <summary>
        /// 角色名称
        /// </summary>
        public string RoleName { get; set; } = string.Empty;


        /// <summary>
		/// 中心Code
		/// </summary>
		public string SiteCode { get; set; } = string.Empty;

        /// <summary>
        /// 项目编码
        /// </summary>
        public string ResearchProgramNo { get; set; } = string.Empty;

        public List<EnumList> EnumList { get; set; } = new List<EnumList> { };


        /// <summary>
		/// 对象名称
		/// </summary>
		public string ObjectType { get; set; } = string.Empty;

        /// <summary>
        /// 标识
        /// </summary>
        public string Identification { get; set; } = string.Empty;

        /// <summary>
        /// 访视计划ID
        /// </summary>
        public Guid? VisitStageId { get; set; }


        /// <summary>
        /// 通用ID
        /// </summary>
        public Guid? GeneralId { get; set; }



        ////需要单独处理
        //public string IP { get; set; }

        public DateTime? CreateTime { get; set; }

    }


    public class EnumList
    {
        public string Key { get; set; } = string.Empty;

        public string Code { get; set; } = string.Empty;

        public string Type { get; set; } = string.Empty;
    }

    public interface IInspectionDTO
    {
        public DataInspectionAddDTO AuditInfo { get; set; }
    }

    public interface ISignDTO
    {
        public SignDTO SignInfo { get; set; }

    }

    #region Setting
    /// <summary>
    /// 配置 基础逻辑信息
    /// </summary>
    public class InsBasicTrialConfig : InspectionBase, IInspectionDTO, ISignDTO
    {
        public BasicTrialConfig OptCommand { get; set; }
    }

    /// <summary>
    /// 配置流程
    /// </summary>
    public class InsTrialProcessConfig : InspectionBase, IInspectionDTO, ISignDTO
    {
        public TrialProcessConfig OptCommand { get; set; }
    }

    /// <summary>
    /// 配置加急信息
    /// </summary>
    public class InsTrialUrgentConfig : InspectionBase, IInspectionDTO, ISignDTO
    {
        public TrialUrgentConfig OptCommand { get; set; }
    }
    #endregion

    public class SetCheckPassDto
    {
        public Guid qcChallengeId { get; set; }
        public Guid subjectVisitId { get; set; }
        public QCChallengeCloseEnum closeEnum { get; set; }
        public string closeReason { get; set; }
    }


    public class SetNeedReuploadDto
    {
       public Guid trialId { get; set; }
       public Guid qcChallengeId { get; set; }
    }

    public class SetVisitUrgentDto
    {
        public Guid trialId { get; set; }
        public Guid subjectVisitId { get; set; }
        public bool setOrCancel { get; set; }
    }

    public class QCPassedOrFailedDto
    {
        public Guid trialId { get; set; }
        public Guid subjectVisitId { get; set; }
        public Guid signId { get; set; }
        public AuditStateEnum auditState { get; set; }
    }

    public class SetSeriesStateDto
    {
        public Guid subjectVisitId { get; set; }
        public Guid studyId { get; set; }
        public Guid seriesId { get; set; }
        public int state { get; set; }
    }

    public class UpdateModalityDto
    {
        public Guid id { get; set; }
        public int type { get; set; }
        public string modality { get; set; }
        public string bodyPart { get; set; }
    }

    public class CloseQCChallengeDto
    {
        public Guid qcChallengeId { get; set; }
        public Guid subjectVisitId { get; set; }
        public QCChallengeCloseEnum closeEnum { get; set; }
        public string closeReason { get; set; }
    }

    public class AddOrUpdateQCChallengeDto
    {
        public QCChallengeCommand qaQuestionCommand { get; set; }
        public Guid trialId { get; set; }
        public TrialQCProcess trialQCProcess { get; set; }
        public CurrentQC currentQCType { get; set; }
    }

    public class AddOrUpdateQCQuestionAnswerListDto
    {
        public QCQuestionAnswerCommand[] qcQuestionAnswerCommands { get; set; }
        public Guid trialId { get; set; }
        public Guid subjectVisitId { get; set; }
        public TrialQCProcess trialQCProcess { get; set; }
        public CurrentQC currentQCType { get; set; }

    }


    public class ObtainOrCancelQCTaskDto
    {
       public Guid trialId { get; set; }
        public Guid subjectVisitId { get; set; }
        public bool obtaionOrCancel { get; set; }
    }

    public class DataInspectionDto<T> :  IInspectionDTO, ISignDTO
    {
      


        public T OptCommand { get; set; }


        public DataInspectionAddDTO AuditInfo
        {
            get
            {
                if (auditInfo.JsonDetail.IsNullOrEmpty())
                {
                    IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
                    timeFormat.DateTimeFormat = "yyyy-MM-dd";
                    auditInfo.JsonDetail = JsonConvert.SerializeObject(OptCommand, Newtonsoft.Json.Formatting.Indented, timeFormat);
                }
              
                return auditInfo;
            }
            set
            {
                auditInfo = value;
            }
        }

        private DataInspectionAddDTO auditInfo=new DataInspectionAddDTO ();

        public SignDTO SignInfo { get; set; } = new SignDTO() { };
    }

    #region Qc
    public class DeleteStudyList
    {
        public Guid[] ids { get; set; }
        public Guid subjectVisitId { get; set; }
        public Guid trialId { get; set; }
    }
    #endregion

    #region 受试者
    public class InsSubjectCommand : InspectionBase, IInspectionDTO, ISignDTO
    {
        public SubjectCommand OptCommand { get; set; }
    }

    public class InsUpdateSubjectStatus : InspectionBase, IInspectionDTO, ISignDTO
    {
        public SubjectStatusChangeCommand OptCommand { get; set; }
    }


    public class InsDeleteSubjectDto : InspectionBase, IInspectionDTO, ISignDTO
    {
        public DeleteSubjectDto OptCommand { get; set; }
    }


    public class DeleteSubjectDto
    {
        public Guid SubjectId { get; set; }

        public Guid TrialId { get; set; }

        public Guid SiteId { get; set; }

        public string Code { get; set; } = string.Empty;
    }

    #endregion

    
      

    /// <summary>
    /// 用户 签名某个文档  Dto
    /// </summary>
    public class TrialDocumentConfirmDTO : InspectionBase, IInspectionDTO, ISignDTO
    {       
        public UserConfirmCommand OptCommand { get; set; }

    }

    public class GetDataInspectionOutDto : DataInspection
    {
        public string ExperimentName { get; set; } = string.Empty;



        public string FirstName { get; set; } = string.Empty;

        public string LastName { get; set; } = string.Empty;

        public string VisitName { get; set; } = string.Empty;

        public string ParentJson { get; set; } = string.Empty;

        public string CreateUser { get; set; } = string.Empty;
        public string UserFirstName { get; set; } = string.Empty;
        public string UserLastName { get; set; } = string.Empty;
        public string Description { get; set; } = string.Empty;

        public string ModuleTypeName { get; set; } = string.Empty;


        public string SignText { get; set; } = string.Empty;

        public decimal? VisitNum { get; set; }


    }


    public class GetDataInspectionDto : PageInput
    {
       

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

        /// <summary>
        /// 中心
        /// </summary>
        public Guid? SiteId { get; set; }

        /// <summary>
        /// 受试者
        /// </summary>
        public string  SubjectInfo { get; set; } = string.Empty;

        /// <summary>
        /// 
        /// </summary>
        public decimal? VisitPlanInfo { get; set; }

        /// <summary>
        /// 开始时间
        /// </summary>
        public DateTime? StartTime { get; set; }

        /// <summary>
        /// 结束时间
        /// </summary>
        public DateTime? EndTime { get; set; }



        /// <summary>
        /// 功能模块
        /// </summary>
        public string ModuleType { get; set; } = string.Empty;

        /// <summary>
        /// Description
        /// </summary>
        public string Description { get; set; } = string.Empty;

        /// <summary>
        /// 操作人名称模糊查询
        /// </summary>
        public string OpByUserName { get; set; } = string.Empty;

        /// <summary>
        /// 阅读片人
        /// </summary>
        public string ReaderUser { get; set; } = string.Empty;

        /// <summary>
        /// 是否有签名
        /// </summary>
        public bool? IsSign { get; set; }




    }

    public class InspectionBase
    {
        public DataInspectionAddDTO AuditInfo { get; set; }

        public SignDTO SignInfo { get; set; } = new SignDTO();
    }
}