using AutoMapper;
using AutoMapper.EquivalencyExpression;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.DTO;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;

namespace IRaCIS.Core.Application.Service
{
    public class TrialSiteUserConfig : Profile
    {
        public TrialSiteUserConfig()
        {
            //CreateMap<TrialAttachment, AcquisitionSpecificationDTO>();
            //CreateMap<TrialAttachmentCommand, TrialAttachment>().ForMember(t => t.UserTypes, u => u.MapFrom(k => string.Join(',', k.UserTypeList)));



            //CreateMap<TrialTaskConfigView, Trial>().ForMember(d => d.Id, u => u.MapFrom(s => s.TrialId)).ReverseMap();


            CreateMap<Trial, TrialProcessConfigDTO>();


            CreateMap<ReadingQuestionCriterionTrial, TrialTaskConfigView>()
                .ForMember(d => d.QCProcessEnum, u => u.MapFrom(s => s.Trial.QCProcessEnum))
                .ForMember(d => d.IsImageConsistencyVerification, u => u.MapFrom(s => s.Trial.IsImageConsistencyVerification))
                .ReverseMap();


            CreateMap<TrialTaskConfig, Trial>().ForMember(d => d.Id, u => u.MapFrom(s => s.TrialId)).ReverseMap();

            CreateMap<TrialReadingTaskViewConfig, Trial>().ForMember(d => d.Id, u => u.MapFrom(s => s.TrialId)).ReverseMap();

            CreateMap<TrialJudgeTaskConfig, Trial>().ForMember(d => d.Id, u => u.MapFrom(s => s.TrialId));



            CreateMap<UserTrialCommand, TrialUser>();

            CreateMap<TrialSiteCommand, TrialSite>()
                .ForMember(x => x.Id, x => x.Ignore());

            CreateMap<EditTrialSiteCommand, TrialSite>();

            CreateMap<UpdateTrialUserCommand, TrialUser>();



            CreateMap<AssginSiteCRCCommand, TrialUser>();

            CreateMap<TrialUserAddCommand, TrialUser>();

            CreateMap<SiteCRCCommand, TrialUser>();


            //临床项目
            CreateMap<TrialCommand, Trial>().ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null));

            CreateMap<Dictionary, TrialDictionaryView>();

            var userId = Guid.Empty;
            var userTypeEnumInt = 0;
            var isEn_Us = false;
            CreateMap<Trial, TrialDetailDTO>()
                .ForMember(x => x.CriterionList, y => y.MapFrom(z => z.TrialReadingCriterionList.Where(n => n.IsConfirm).Select(m => m.CriterionName)))
                .ForMember(d => d.DictionaryList, u => u.MapFrom(s => s.TrialDicList.Select(t => t.Dictionary).OrderBy(t => t.ShowOrder)))
                //.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode))
                .ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName))
                .ForMember(d => d.Phase, u => u.MapFrom(s => isEn_Us ? s.Phase.Value : s.Phase.ValueCN))
                //.ForMember(d => d.DeclarationType, u => u.MapFrom(s => s.DeclarationType.MappedValue))
                .ForMember(d => d.IndicationType, u => u.MapFrom(s => isEn_Us ? s.IndicationType.Value : s.IndicationType.ValueCN))
                .ForMember(d => d.CRO, u => u.MapFrom(s => s.CRO.CROName))
                .ForMember(d => d.ReviewMode, u => u.MapFrom(s => isEn_Us ? s.ReviewMode.Value : s.ReviewMode.ValueCN))
                //.ForMember(d => d.ReviewType, u => u.MapFrom(s => s.ReviewType.Value))
                .ForMember(d => d.IsLocked, u => u.MapFrom(s => s.WorkloadList.Any(u => u.DataFrom == (int)WorkLoadFromStatus.FinalConfirm)))
                 .ForMember(d => d.UserFeedBackUnDealedCount, u => u.MapFrom(s => s.UserFeedBackList.Count(t => t.State == 0)))


                //.ForMember(d => d.SiteCount, u => u.MapFrom(s => userTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator ? s.TrialSiteUserList.Count(k => k.UserId == userId) : s.TrialSiteList.Count()))
                //.ForMember(d => d.StudyCount, u => u.MapFrom(s => userTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator ? s.StudyList.Count(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)) : s.StudyList.Count()))
                //.ForMember(d => d.SubjectCount, u => u.MapFrom(s => userTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator ? s.SubjectList.Count(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)) : s.SubjectList.Count()))
                ;




            CreateMap<TrialUser, TrialMaintenanceDTO>().IncludeMembers(t => t.User)
            .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.User.FullName))
            .ForMember(t => t.UserType, u => u.MapFrom(t => t.User.UserTypeRole.UserTypeShortName));
            CreateMap<User, TrialMaintenanceDTO>();

            var trialSiteId = Guid.Empty;
            CreateMap<TrialUser, AssginSiteCRCListDTO>().IncludeMembers(t => t.User)
              .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.User.FullName))
              .ForMember(d => d.TrialSiteId, u => u.MapFrom(t => trialSiteId))
              .ForMember(d => d.UserType, u => u.MapFrom(t => t.User.UserTypeRole.UserTypeShortName))
              .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.Trial.TrialSiteUserList.Any(k => k.UserId == t.UserId && k.TrialSiteId== trialSiteId)));
            CreateMap<User, AssginSiteCRCListDTO>();

            var trialId = Guid.Empty;
            CreateMap<User, TrialUserScreeningDTO>()
             .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.FullName))
              .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
              .ForMember(d => d.UserId, u => u.MapFrom(s => s.Id))
              .ForMember(d => d.TrialId, u => u.MapFrom(s => trialId))
              .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.UserTrials.Any(t => t.TrialId == trialId)));


            CreateMap<Site, SiteSelectDTO>()
          .ForMember(d => d.HospitalName, u => u.MapFrom(s => isEn_Us ? s.Hospital.HospitalName : s.Hospital.HospitalNameCN));

            //trial site 选择列表  subjectVisit pannel 模式添加的时候

            CreateMap<Site, TrialSiteScreeningDTO>()
                 .ForMember(d => d.IsSelect, u => u.MapFrom(s => s.TrialSiteList.Any(k => k.TrialId == trialId)))
                 .ForMember(d => d.SiteName, u => u.MapFrom(c => isEn_Us ? c.SiteName : c.SiteNameCN));

            #region 项目 stie pannel

            #region  site 也有country  hospital 也有  注意区分
            CreateMap<TrialSite, SiteStatDTO>()

            .ForMember(d => d.TrialSiteId, u => u.MapFrom(s => s.Id))
            .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count()))
             .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count()))
           .ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count()))
           .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.User.FullName)));
            #endregion





            CreateMap<TrialSite, SiteStatSimpleDTO>()
              .ForMember(d => d.Id, u => u.MapFrom(s => s.Id))
              .ForMember(d => d.TrialSiteId, u => u.MapFrom(s => s.Id))
              .ForMember(d => d.UpdateTime, u => u.MapFrom(s => s.UpdateTime))
              //.ForMember(d => d.Site, u => u.MapFrom(s =>  isEn_Us  ?s.Site.SiteName:s.Site.SiteNameCN))
              //.ForMember(d => d.Hospital, u => u.MapFrom(s => s.Site.Hospital.HospitalName))
              .ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count()))
              .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count()))
              .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count()))
              .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.User.FullName)))
              .ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.TrialSiteDicomAEList.Select(u => u.CallingAE)));
            //CreateMap<Site, SiteStatSimpleDTO>();



            CreateMap<TrialSiteUser, UserTrialDTO>().IncludeMembers(t => t.User)
                .ForMember(d => d.UserType, u => u.MapFrom(s => s.User.UserTypeRole.UserTypeShortName))
                .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.User.FullName));
            CreateMap<User, UserTrialDTO>();
            #endregion



            CreateMap<AssginSiteCRCCommand, TrialSiteUser>();


            CreateMap<Domain.Models.Trial, TrialConfigDTO>().ForMember(t => t.TrialId, u => u.MapFrom(c => c.Id))
                    .ForMember(t => t.TrialCriterionIds, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.Id)))
                    .ForMember(t => t.TrialCriterionNames, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.CriterionName)))
                    .ForMember(t => t.ClinicalDataTrialSetIds, u => u.MapFrom(c => c.ClinicalDataTrialSetList.Where(v => v.IsConfirm).Select(r => r.Id)))
                    .ForMember(t => t.ClinicalDataSetNames, u => u.MapFrom(c => c.ClinicalDataTrialSetList.Where(v => v.IsConfirm).Select(r => isEn_Us ? r.ClinicalDataSetEnName : r.ClinicalDataSetName)))
                    //.ForMember(t => t.CriterionIds, u => u.MapFrom(c => c.TrialDicList.Where(v => v.KeyName == StaticData.Criterion).Select(r => r.DictionaryId)))
                    ;
            CreateMap<Domain.Models.Trial, TrialSubjectConfig>();
            CreateMap<Domain.Models.Trial, TrialSubjectAndSVConfig>();


            CreateMap<BasicTrialConfig, Trial>();

            CreateMap<TrialProcessConfig, Trial>().ForMember(t => t.TrialDicList, u => u.MapFrom(k => k.CriterionIds));
            CreateMap<Guid, TrialDictionary>().EqualityComparison((odto, o) => odto == o.DictionaryId)
                .ForMember(t => t.DictionaryId, u => u.MapFrom(c => c))
                 .ForMember(t => t.KeyName, u => u.MapFrom(c => StaticData.Criterion));


            CreateMap<Trial, TrialSelectDTO>();

            CreateMap<TrialUrgentConfig, Trial>();
            CreateMap<Trial, TrialUrgentConfig>().ForMember(t => t.TrialId, u => u.MapFrom(c => c.Id));

            CreateMap<SignDTO, TrialSign>();


            CreateMap<SignDTO, TrialSign>();

            CreateMap<TrialStateChange, TrialStateChangeDTO>()
                 .ForMember(t => t.UserRealName, u => u.MapFrom(c => c.CreateUser.FullName))
                 .ForMember(t => t.UserName, u => u.MapFrom(c => c.CreateUser.UserName));



            CreateMap<TrialExternalUserAddAndSendEmail, TrialExternalUser>().ReverseMap();

            CreateMap<TrialExternalUserAddAndSendEmail, User>();

            CreateMap<TrialExternalUser, TrialExternalUserAddOrEdit>().ReverseMap();
            CreateMap<TrialExternalUserAddOrEdit, User>();

            CreateMap<TrialExternalUser, TrialExternalUserView>();


            CreateMap<User, TrialExternalUser>().ReverseMap();





            CreateMap<TrialExternalUser, TrialInfoWithPreparationInfo>().IncludeMembers(t => t.Trial)
                .ForMember(t => t.UserId, u => u.MapFrom(c => c.SystemUserId));
            CreateMap<Trial, TrialInfoWithPreparationInfo>();

            CreateMap<TrialSiteUserSurvey, TrialInfoWithPreparationInfo>().IncludeMembers(t => t.TrialSiteSurvey.Trial)
                .ForMember(t => t.UserId, u => u.MapFrom(c => c.SystemUserId))
                .ForMember(t => t.TrialId, u => u.MapFrom(c => c.TrialSiteSurvey.TrialId));


            CreateMap<TrialExternalUserConfirm, TrialExternalUser>();

            CreateMap<TrialExternalUserConfirm, TrialSiteUserSurvey>();

            CreateMap<ReadingCriterionPage, ReadingCriterionPageDto>();

            CreateMap<Trial, TrialBasicConfigView>();


            CreateMap<Trial, TrialUserExportDTO>()
                .ForMember(t => t.TrialUserList, u => u.Ignore());




            CreateMap<ReadingQuestionCriterionTrial, GetTrialReadingInfoOutDto>()
                .ForMember(t => t.TrialModalitys, u => u.MapFrom(c => c.Trial.Modalitys))
                .ForMember(t => t.TrialReadingCriterionId, u => u.MapFrom(c => c.Id))
                 .ForMember(t => t.TrialReadingCriterionName, u => u.MapFrom(c => c.CriterionName));


            CreateMap<ReadingQuestionTrial, TrialAdditionaQuestion>()
                 .ForMember(d => d.GroupName, u => u.MapFrom(s => s.GroupInfo == null ? s.GroupName : s.GroupInfo.GroupName))
           .ForMember(d => d.GroupEnName, u => u.MapFrom(s => s.GroupInfo == null ? s.GroupEnName : s.GroupInfo.GroupEnName))
       .ForMember(t => t.PageName, u => u.MapFrom(c => c.ReadingCriterionPage.PageName))
          .ForMember(d => d.ParentQuestionGenre, u => u.MapFrom(s => s.ParentReadingQuestionTrial.QuestionGenre))
             .ForMember(d => d.ParentDictionaryCode, u => u.MapFrom(s => s.ParentReadingQuestionTrial.DictionaryCode))
        .ForMember(t => t.ParentQuestionName, u => u.MapFrom(c => c.ParentReadingQuestionTrial.QuestionName))
          .ForMember(t => t.RelevanceShowOrder, u => u.MapFrom(c => c.RelevanceReadingQuestionTrial.ShowOrder))
              .ForMember(t => t.ParentQuestionShowOrder, u => u.MapFrom(c => c.ParentReadingQuestionTrial.ShowOrder));

            CreateMap<ReadingQuestionTrial, TrialReadQuestion>()
            .ForMember(d => d.GroupName, u => u.MapFrom(s => s.GroupInfo == null ? s.GroupName : s.GroupInfo.GroupName))
           .ForMember(d => d.GroupEnName, u => u.MapFrom(s => s.GroupInfo == null ? s.GroupEnName : s.GroupInfo.GroupEnName))
       .ForMember(t => t.PageName, u => u.MapFrom(c => c.ReadingCriterionPage.PageName))
          .ForMember(d => d.ParentQuestionGenre, u => u.MapFrom(s => s.ParentReadingQuestionTrial.QuestionGenre))
             .ForMember(d => d.ParentDictionaryCode, u => u.MapFrom(s => s.ParentReadingQuestionTrial.DictionaryCode))
        .ForMember(t => t.ParentQuestionName, u => u.MapFrom(c => c.ParentReadingQuestionTrial.QuestionName))
          .ForMember(t => t.RelevanceShowOrder, u => u.MapFrom(c => c.RelevanceReadingQuestionTrial.ShowOrder))
              .ForMember(t => t.ParentQuestionShowOrder, u => u.MapFrom(c => c.ParentReadingQuestionTrial.ShowOrder));



            CreateMap<Trial, TrialSiteUserExportDto>()
                .ForMember(t => t.TrialSiteUserList, u => u.Ignore());

            CreateMap<TrialSiteUser, SiteUserExportDTO>().IncludeMembers(t => t.User)
                 .ForMember(t => t.TrialSiteCode, u => u.MapFrom(c => c.TrialSite.TrialSiteCode))
                 .ForMember(t => t.TrialSiteAliasName, u => u.MapFrom(c => c.TrialSite.TrialSiteAliasName))
                .ForMember(t => t.UserRealName, u => u.MapFrom(c => c.User.FullName))
                .ForMember(t => t.UserType, u => u.MapFrom(c => c.User.UserTypeRole.UserTypeShortName));
            CreateMap<User, SiteUserExportDTO>();




            CreateMap<Trial, TrialSiteUserSummaryExportDto>()
                .ForMember(t => t.TrialSiteUserList, u => u.Ignore());

            CreateMap<TrialSiteUserSurvey, TrialSiteUserSummaryDto>()
                .ForMember(d => d.UserType, u => u.MapFrom(s => s.UserTypeRole.UserTypeShortName))
                .ForMember(d => d.UserTypeEnum, u => u.MapFrom(s => s.UserTypeRole.UserTypeEnum))
                .ForMember(t => t.TrialSiteCode, u => u.MapFrom(d => d.TrialSiteSurvey.TrialSite.TrialSiteCode))
                .ForMember(d => d.TrialSiteAliasName, u => u.MapFrom(s => s.TrialSiteSurvey.TrialSite.TrialSiteAliasName));


            CreateMap<Trial, TrialSiteSurveyStat>()
                .ForMember(t => t.ApprovalRequiredCount, u =>
                       u.MapFrom(c => userTypeEnumInt == (int)UserTypeEnum.ProjectManager || userTypeEnumInt == (int)UserTypeEnum.APM ?
                         c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Count()
                         : c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Count())
                )

                 .ForMember(t => t.ApprovalRequiredSiteCount, u =>
                    u.MapFrom(c => userTypeEnumInt == (int)UserTypeEnum.ProjectManager || userTypeEnumInt == (int)UserTypeEnum.APM ?
                        c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.SPMApproved).Select(t => t.TrialSiteId).Distinct().Count()
                        : c.TrialSiteSurveyList.Where(t => t.State == TrialSiteSurveyEnum.CRCSubmitted).Select(t => t.TrialSiteId).Distinct().Count())
                )
                ;

            var userTypeId = Guid.Empty;
            CreateMap<Trial, DocSignStat>()
                .ForMember(t => t.WaitSignCount, u =>
                    u.MapFrom(c => userTypeEnumInt == (int)UserTypeEnum.SuperAdmin ? 0

                        : c.TrialDocumentList.Where(t => t.IsDeleted == false && t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == userTypeId) && !t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == userId && t.ConfirmTime != null)).Count())
                );




        }
    }

}