//--------------------------------------------------------------------
//     此代码由T4模板自动生成  byzhouhang 20210918
//	   生成时间 2022-06-07 14:10:54 
//     对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using System;
using IRaCIS.Core.Domain.Share;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace IRaCIS.Core.Application.ViewModel
{

    public class VisitTaskViewBasic
    {
        public Guid Id { get; set; }
        public Guid TrialId { get; set; }

        public string TaskName { get; set; }
        public string TaskBlindName { get; set; }

        public ReadingCategory ReadingCategory { get; set; }

        public TaskState TaskState { get; set; }


        public DateTime? CheckPassedTime { get; set; }
        public DateTime? AllocateTime { get; set; }
        public Guid SubjectId { get; set; }

        public string TaskCode { get; set; }
        public bool IsUrgent { get; set; }
        public int ArmEnum { get; set; }
        public Guid? DoctorUserId { get; set; }



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


        public Guid SiteId { get; set; }
        public String TrialSiteCode { get; set; } = String.Empty;
        public string SubjectCode { get; set; } = String.Empty;
    }


    /// <summary> VisitTaskView  列表视图模型 </summary>
    public class VisitTaskView : VisitTaskViewBasic
    {



        public string UserCode { get; set; }
        public string UserName { get; set; }
        public string FullName { get; set; }

        public string UserTypeShortName { get; set; }
    }


    public class JudgeVisitTaskView : VisitTaskView
    {

        public List<HistoryReadingDoctorUser> HistoryReadingDoctorUserList { get; set; }

    }


    public class ReadingTaskView : VisitTaskView
    {
        public ReadingTaskState ReadingTaskState { get; set; }

        //建议完成时间
        public int SuggesteDays { get; set; }

        public DateTime? SignTime { get; set; }

        //是否回退过
        public bool IsReturned { get; set; }

    }

    public class ReReadingTaskView : VisitTaskView
    {

        public ReadingTaskState ReadingTaskState { get; set; }


        public DateTime? SignTime { get; set; }


        //重阅原始编号
        public string ReReadingOriginalTaskCode { get; set; }


        public RequestReReadingType RequestReReadingType { get; set; }

        public DateTime? RequestReReadingTime { get; set; }

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

        public DateTime? SuggesteFinishedTime { get; set; }

        public RequestReReadingResult RequestReReadingResultEnum { get; set; }




    }


    public class IRHaveReadView : VisitTaskViewBasic
    {

    }

    public class IRUnReadSubjectView
    {

        //public Guid SiteId { get; set; }
        //public String TrialSiteCode { get; set; } = String.Empty;
        //public Guid TrialId { get; set; }

        public Guid SubjectId { get; set; }
        public string SubjectCode { get; set; } = String.Empty;

        public bool IsUrgent => UnReadTaskList.Any(t=>t.IsUrgent);

        public int? UnReadTaskCount { get; set; }

        public DateTime? SuggesteFinishedTime => UnReadTaskList.Max(t => t.SuggesteFinishedTime);

        public List<IRUnreadTaskView> UnReadTaskList { get; set; } = new List<IRUnreadTaskView>();
    }

    public class IRUnreadTaskView
    {
        public Guid Id { get; set; }

        public bool IsUrgent { get; set; }
        public DateTime? SuggesteFinishedTime { get; set; }
    }


    public class HistoryReadingDoctorUser
    {

        public string? JudgeTaskCode { get; set; }
        public Guid DoctorUserId { get; set; }

        public string UserCode { get; set; }
        public string UserName { get; set; }
        public string FullName { get; set; }
    }




    public class VisitTaskQuery : PageInput
    {
        [NotDefault]
        public Guid TrialId { get; set; }

        public Guid? SiteId { get; set; }

        public Guid? SubjectId { get; set; }

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

        public bool? IsUrgent { get; set; }

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

        public Guid? DoctorUserId { get; set; }

        public ReadingCategory? ReadingCategory { get; set; }

        public TaskState? TaskState { get; set; }

        public ReadingTaskState? ReadingTaskState { get; set; }

        public DateTime? BeginAllocateDate { get; set; }

        public DateTime? EndAllocateDate { get; set; }

        public Guid? OriginalReReadingId { get; set; }
    }

    public class SubjectAssignQuery : PageInput
    {
        [NotDefault]
        public Guid TrialId { get; set; }

        public Guid? SiteId { get; set; }

        public Guid? SubjectId { get; set; }

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


        public Guid? DoctorUserId { get; set; }

        public bool? IsHaveAssigned { get; set; }

        public bool? IsHaveApplyedTask { get; set; }

    }

    public class SubjectAssignView
    {
        public Guid TrialId { get; set; }
        public Guid SiteId { get; set; }

        public Guid SubjectId { get; set; }

        public String TrialSiteCode { get; set; } = String.Empty;
        public string SubjectCode { get; set; } = String.Empty;


        public bool IsAssignedDoctorUser { get; set; }

        public bool IsAssignDoctorApplyedTask => DoctorUserList.All(t => t.IsAssignDoctorApplyedTask) && DoctorUserList.Count > 0;

        public List<Guid> DoctorUserIdList => DoctorUserList.Select(t => t.DoctorUserId).ToList();

        public List<AssignDoctorView> DoctorUserList { get; set; } = new List<AssignDoctorView>();
    }



    public class AssignDoctorView
    {
        public Guid DoctorUserId { get; set; }

        public string UserCode { get; set; }
        public string UserName { get; set; }
        public string FullName { get; set; }

        public string UserTypeShortName { get; set; }

        public DateTime? AssignTime { get; set; }

        public int ArmEnum { get; set; }

        public bool IsAssignDoctorApplyedTask { get; set; }
    }



    public class AssginSubjectDoctorCommand
    {
        public Guid TrialId { get; set; }

        public bool IsReAssign { get; set; }

        public List<Guid> SubjectIdList { get; set; }

        public List<DoctorArm> DoctorUserIdArmList { get; set; }
    }

    public class DoctorArm
    {
        public Guid DoctorUserId { get; set; }

        public int ArmEnum { get; set; }
    }

    public class CancelSubjectAssignCommand
    {
        public Guid TrialId { get; set; }

        public List<Guid> SubjectIdList { get; set; }
    }


    public class AssignConfirmCommand
    {
        public Guid TrialId { get; set; }

        public List<SubjectDoctorCommand> SubjectDoctorUserList { get; set; } = new List<SubjectDoctorCommand>();
    }

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

        public List<Guid> DoctorUserIdList { get; set; } = new List<Guid>();
    }

    public class AutoSubjectAssignCommand
    {
        public Guid TrialId { get; set; }
    }

    public class AssignSubjectTaskToDoctorCommand
    {
        public Guid Id { get; set; }

        public Guid TrialId { get; set; }

        public Guid SubjectId { get; set; }

        public Guid? DoctorUserId { get; set; }

        public TaskOptType TaskOptType { get; set; }

    }

    public enum TaskOptType
    {
        Assign = 1,

        ReAssign = 2,

        Confirm = 3,

        CancelAssign = 4,
    }

}