using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
using IRaCIS.Core.Domain.Share;
using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;

namespace IRaCIS.Core.Application.Contracts
{

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

        public Guid TrialSiteId { get; set; }

        public Guid SubjectId { get; set; }

        public Guid SubjectVisitId { get; set; }


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

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

        public decimal VisitNum { get; set; }

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

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

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

        public DateTime UploadTime { get; set; }

        public string StudyCode { get; set; }


        //[JsonIgnore]
        //public string DicomStudyCode { get; set; } = string.Empty;
        //[JsonIgnore]
        //public int NoneDicomCode { get; set; }

        public string RecordPath { get; set; } = string.Empty;
        public bool IsDicom { get; set; }



    }

    public class UnionStudyMonitorModel : UnionStudyBaseModel
    {
        public Guid StudyId { get; set; }





        public string UploadStartTimeStr => UploadStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
        public string UploadFinishedTimeStr => UploadFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff");

        public string ArchiveFinishedTimeStr => ArchiveFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff");


        public string UploadIntervalStr
        {
            get
            {
                var uploadTimeSpan = UploadFinishedTime - UploadStartTime;

                return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
            }
        }

        public string ArchiveIntervalStr
        {
            get
            {
                var uploadTimeSpan = ArchiveFinishedTime - UploadFinishedTime;

                return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
            }
        }



        public string TimeInterval
        {
            get
            {

                var uploadTimeSpan = ArchiveFinishedTime - UploadStartTime;

                return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";

            }
        }

        public DateTime UploadStartTime { get; set; }


        public DateTime? UploadFinishedTime { get; set; }

        public DateTime? ArchiveFinishedTime { get; set; }


        public decimal FileSize { get; set; }

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


        public bool IsDicomReUpload { get; set; }


        public int FileCount { get; set; }

        public bool IsSuccess { get; set; }

        public string Note = string.Empty;

    }


    public class UnionStudyViewModel : UnionStudyBaseModel
    {

        public Guid Id { get; set; }

        public bool IsFromPACS { get; set; }

        public int? Count { get; set; }


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

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

        public DateTime? StudyTime { get; set; }


    }



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

        public Guid? SubjectId { get; set; }

        public Guid? TrialSiteId { get; set; }
        public Guid? SubjectVisitId { get; set; }

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


        public string[]? VisitPlanArray { get; set; }

        public Guid? VisitTaskId { get; set; }

        public bool? IsDicom { get; set; }

        public string? Uploader { get; set; }

        public bool? IsSuccess { get; set; }

        public string? StudyCode { get; set; }

        public bool? IsFromPACS { get; set; }


        public DateTime? UploadStartTime { get; set; }

        public DateTime? UploadFinishedTime { get; set; }
    }


    public class PriArchiveTaskStudyCommand
    {

        [NotDefault]
        public Guid TrialId { get; set; }

        [NotDefault]
        public Guid SubjectId { get; set; }

        [NotDefault]
        public Guid SubjectVisitId { get; set; }

        public int FileCount { get; set; }
    }

    public class PreArchiveDicomStudyCommand
    {


        [NotDefault]
        public Guid TrialId { get; set; }
        [NotDefault]
        public Guid TrialSiteId { get; set; }
        [NotDefault]
        public Guid SubjectId { get; set; }
        [NotDefault]
        public Guid SubjectVisitId { get; set; }

        public bool IsDicomReUpload { get; set; }


        public int FileCount { get; set; }
    }


    public class SubejctZipInfoQuery
    {
        public Guid? SubejctId { get; set; }

        public string? SubjectCode { get; set; }


        public Guid? SubejectVisitId { get; set; }

        public Guid? TrialReadingCriterionId { get; set; }

    }

    public class TaskStudyAchivePreConfirmCommand
    {
        public List<string> StudyInstanceUidList { get; set; }

        [NotDefault]
        public Guid SubjectId { get; set; }
        [NotDefault]
        public string SubjectCode { get; set; }

        [NotDefault]
        public Guid TrialId { get; set; }

        public Guid? VisitTaskId { get; set; }

    }

    public class TaskStudyArchiveConfirmResult
    {
        public string StudyInstanceUid { get; set; }

        public bool IsAllowUpload { get; set; }

        public bool IsAllowReUpload { get; set; }

    }

    public class TaskArchiveStudyCommand
    {
        [NotDefault]
        public Guid TrialId { get; set; }
        [NotDefault]
        public Guid SubjectId { get; set; }

        [NotDefault]
        public Guid StudyMonitorId { get; set; }

        public int FailedFileCount { get; set; }

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

        public AddOrUpdateStudyDto Study { get; set; }

        [NotDefault]
        public Guid VisitTaskId { get; set; }
    }

    public class NewArchiveStudyCommand
    {
        [NotDefault]
        public Guid TrialId { get; set; }
        [NotDefault]
        public Guid TrialSiteId { get; set; }
        [NotDefault]
        public Guid SubjectId { get; set; }
        [NotDefault]
        public Guid SubjectVisitId { get; set; }
        [NotDefault]
        public Guid StudyMonitorId { get; set; }

        public int FailedFileCount { get; set; }

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

        public AddOrUpdateStudyDto Study { get; set; }


    }

    public class AddOrUpdateStudyDto
    {


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

        //public int Code { get; set; } = 0;

        //public string StudyCode { get; set; } = string.Empty;


        public string StudyInstanceUid { get; set; } = string.Empty;
        public DateTime? StudyTime { get; set; }
        public string Modalities { get; set; } = string.Empty;

        public string Description { get; set; } = string.Empty;
        public int SeriesCount { get; set; } = 0;
        public int InstanceCount { get; set; } = 0;

        public string InstitutionName { get; set; } = string.Empty;
        public string PatientId { get; set; } = string.Empty;
        public string PatientName { get; set; } = string.Empty;
        public string PatientAge { get; set; } = string.Empty;
        public string PatientSex { get; set; } = string.Empty;

        public string AccessionNumber { get; set; } = string.Empty;
        public string PatientBirthDate { get; set; } = string.Empty;
        public string AcquisitionTime { get; set; } = string.Empty;
        public string AcquisitionNumber { get; set; } = string.Empty;
        public string TriggerTime { get; set; } = string.Empty;

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

        public List<AddOrUpdateSeriesDto> SeriesList { get; set; }


    }

    public class AddOrUpdateSeriesDto
    {
        public string StudyInstanceUid { get; set; }
        public string SeriesInstanceUid { get; set; }
        public int SeriesNumber { get; set; }
        public DateTime? SeriesTime { get; set; }
        public string Modality { get; set; } = string.Empty;
        public string Description { get; set; } = string.Empty;
        public int InstanceCount { get; set; }
        public string SliceThickness { get; set; } = string.Empty;

        public string ImagePositionPatient { get; set; } = string.Empty;
        public string ImageOrientationPatient { get; set; } = string.Empty;
        public string BodyPartExamined { get; set; } = string.Empty;
        public string SequenceName { get; set; } = string.Empty;
        public string ProtocolName { get; set; } = string.Empty;
        public string ImagerPixelSpacing { get; set; } = string.Empty;

        public string AcquisitionTime { get; set; } = string.Empty;
        public string AcquisitionNumber { get; set; } = string.Empty;
        public string TriggerTime { get; set; } = string.Empty;

        public string ImageResizePath { get; set; } = string.Empty;
        public List<AddInstanceDto> InstanceList { get; set; }

        public Guid? VisitTaskId { get; set; }
    }


    public class AddInstanceDto
    {
        public string StudyInstanceUid { get; set; }
        public string SeriesInstanceUid { get; set; }
        public string SopInstanceUid { get; set; }
        public int InstanceNumber { get; set; }
        public DateTime? InstanceTime { get; set; }
        public bool CPIStatus { get; set; }
        public int ImageRows { get; set; }
        public int ImageColumns { get; set; }
        public int SliceLocation { get; set; }


        public string SliceThickness { get; set; } = string.Empty;
        public int NumberOfFrames { get; set; }
        public string PixelSpacing { get; set; } = string.Empty;

        public string ImagerPixelSpacing { get; set; } = string.Empty;
        public string FrameOfReferenceUID { get; set; } = string.Empty;
        public string WindowCenter { get; set; } = string.Empty;
        public string WindowWidth { get; set; } = string.Empty;

        public bool Anonymize { get; set; }
        public string Path { get; set; } = string.Empty;

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

        public long FileSize { get; set; }
    }

    public class CRCUploadTaskQuery
    {
        [NotDefault]
        public Guid SubjectId { get; set; }

        [NotDefault]
        public Guid TrialReadingCriterionId { get; set; }

        [NotDefault]
        public string SubjectCode { get; set; }
    }

    public class CRCUploadTaskStudyQuery : SortInput
    {

        [NotDefault]
        public Guid VisitTaskId { get; set; }
    }


    public class IRUploadStudyQuery : SortInput
    {
        public Guid? SubjectId { get; set; }

        [NotDefault]
        public Guid TrialReadingCriterionId { get; set; }

        public string? SubjectCode { get; set; }

        public Guid? VisitTaskId { get; set; }
    }

    public class IRTaskUploadedDicomStudyQuery
    {
        [NotDefault]
        public Guid VisitTaskId { get; set; }
    }

    public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo
    {

        public int UploadedSeriesCount { get; set; }

        public int UploadedInstanceCount { get; set; }

        public List<string> UploadedSopInstanceUidList { get; set; }


    }

    public class IRUploadTaskNoneDicomStudyDto : NoneDicomStudyBasicInfo
    {

        public int UploadedFileCount { get; set; }
    }

    public class TaskDicomStudyDTO : DicomStudyBasicInfo
    {
        public Guid SubjectId { get; set; }

        public string SubjectCode { get; set; }

        public string TaskBlindName { get; set; }

        public string TaskName { get; set; }
        public Guid? SourceSubjectVisitId { get; set; }




        public int UploadedSeriesCount { get; set; }

        public int UploadedInstanceCount { get; set; }

        public List<string> UploadedSopInstanceUidList { get; set; }


    }

    public class NoneDicomFileInfo
    {
        [JsonIgnore]
        public Guid? OriginNoneDicomStudyId { get; set; }

        public string FileType { get; set; }

        public long? FileSize { get; set; }
        public string FileName { get; set; }

        public string Path { get; set; }
    }

    public class TaskNoneDicomStudyDTO : NoneDicomStudyBasicInfo
    {
        public Guid VisitTaskId { get; set; }

        public int UploadedFileCount { get; set; }

        public List<NoneDicomFileInfo> UploadedFileList { get; set; }

        public List<NoneDicomFileInfo> FileList { get; set; }

        public Guid SubjectId { get; set; }

        public string SubjectCode { get; set; }

        public string TaskBlindName { get; set; }

        public string TaskName { get; set; }
        public Guid? SourceSubjectVisitId { get; set; }

        public ReadingTaskState ReadingTaskState { get; set; }

    }



    public class CRCUploadedStudyQuqry
    {
        [NotDefault]
        public Guid SubjectVisitId { get; set; }

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

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

    public class IRReadingDownloadQuery : SortInput
    {
        public Guid? SubjectId { get; set; }

        [NotDefault]
        public Guid TrialReadingCriterionId { get; set; }

        public string? SubjectCode { get; set; }

        public Guid? VisitTaskId { get; set; }
    }


    public class IRDownloadQuery
    {
        [NotDefault]
        public Guid SubjectId { get; set; }

        [NotDefault]
        public Guid TrialReadingCriterionId { get; set; }

        [NotDefault]
        public string SubjectCode { get; set; }

        public List<SubjectVisitTaskInfo> SubjectVisitTaskList { get; set; }

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

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

    }

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

        public string TrialSiteCode { get; set; }

        public string SubjectCode { get; set; }

        public bool IsSuccess { get; set; }

        public DateTime DownloadStartTime { get; set; }
        public DateTime? DownloadEndTime { get; set; }

        public string VisitName { get; set; }

        public ImageType ImageType { get; set; }

        public int NoneDicomStudyCount { get; set; }

        public int DicomStudyCount { get; set; }

        public int ImageCount { get; set; }
        public long ImageSize { get; set; }


        public string UserName { get; set; }

        public string UserFullName { get; set; }
        public DateTime CreateTime { get; set; }

        public string IP { get; set; }

        public UserTypeEnum UserTypeEnum { get; set; }


        public string UploadIntervalStr
        {
            get
            {
                var uploadTimeSpan = DownloadEndTime - DownloadStartTime;

                return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
            }
        }

    }

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

        public string? SubjectCode { get; set; }

        public ImageType? ImageType { get; set; }

        public UserTypeEnum? UserType { get; set; }

        public bool? IsSuccess { get; set; }

        public DateTime? DownloadStartTime { get; set; }
        public DateTime? DownloadEndTime { get; set; }

        public string? IP { get; set; }

        public string? Name { get; set; }
    }

    public class SubjectVisitTaskInfo
    {
        public Guid SubjectVisitId { get; set; }

        public Guid TaskId { get; set; }
    }
}