using Aliyun.OSS;
using DocumentFormat.OpenXml.Spreadsheet;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service.BusinessFilter;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Encryption;
using IRaCIS.Core.Infrastructure.NewtonsoftJson;
using MassTransit;
using MassTransit.Mediator;
using Medallion.Threading;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MiniExcelLibs;
using NPOI.SS.Formula.Functions;
using NPOI.XWPF.UserModel;
using System.Globalization;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
using System.Text;



namespace IRaCIS.Core.Application.Service
{
    [ApiExplorerSettings(GroupName = "Institution")]
    public class TestService(IRepository<Dictionary> _dicRepository,
        IRepository<Trial> _trialRepository,
        IOptionsMonitor<SystemEmailSendConfig> _systemEmailConfig,
        IOptionsMonitor<ServiceVerifyConfigOption> _basicConfig,
        IRepository<SystemDocument> _systemDocumentRepository,
        IRepository<TrialClinicalDataSetCriterion> _trialClinicalDataSetCriterionRepository,
        IRepository<DicomInstance> _dicomInstanceRepository,
        IRepository<Internationalization> _internationalizationRepository,
        IRepository<SystemDocConfirmedUser> _systemDocConfirmedUserRepository,
        IRepository<DicomStudy> _dicomStudyRepository,
        IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
        IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
        IRepository<VisitTask> _visitTaskRepository,
        IRepository<DicomSeries> _dicomSeriesRepository,
        IRepository<UserRole> _userRoleRepository,
        IRepository<TrialBodyPart> _trialBodyPartRepository,
        IDistributedLockProvider _distributedLockProvider,
        ILogger<TestService> _logger, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
    {
        public static int IntValue = 100;
        /// <summary>
        /// 清理一致性分析任务
        /// </summary>
        /// <param name="trialReadingCriterionId"></param>
        /// <param name="_taskConsistentRuleRepository"></param>
        /// <param name="_readingConsistentClinicalDataPDFRepository"></param>
        /// <param name="_readingConsistentClinicalDataRepository"></param>
        /// <returns></returns>
        public async Task<IResponseOutput> DeleteConsistentDate(Guid trialReadingCriterionId,
             [FromServices] IRepository<TaskConsistentRule> _taskConsistentRuleRepository,
             [FromServices] IRepository<ReadingConsistentClinicalDataPDF> _readingConsistentClinicalDataPDFRepository,
             [FromServices] IRepository<ReadingConsistentClinicalData> _readingConsistentClinicalDataRepository
            )
        {


            var consistentSubjectIdList = _visitTaskRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true).Select(t => t.SubjectId).ToList();

            await _taskConsistentRuleRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId);

            await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == true);

            await _readingConsistentClinicalDataPDFRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.ReadingConsistentClinicalData.SubjectId));

            await _readingConsistentClinicalDataRepository.BatchDeleteNoTrackingAsync(t => consistentSubjectIdList.Contains(t.SubjectId));

            await _readingConsistentClinicalDataRepository.SaveChangesAsync();
            return ResponseOutput.Ok();
        }
        public async Task<IResponseOutput> DeleteOSSDate(string rootFolder,
            [FromServices] IOSSService _oSSService, [FromServices] IWebHostEnvironment _hostEnvironment)
        {

            //var deleteIdList = _trialRepository.Where(t => t.IsDeleted == true, false, true).Select(t => t.Id).ToList();
            //foreach (var deleteId in deleteIdList)
            //{
            //    await _oSSService.DeleteFromPrefix($"{deleteId}");
            //}


            var trialIdExistList = _trialRepository.Select(t => t.Id).ToList().Select(t => t.ToString());

            #region 列出根目录

            var aliConfig = _oSSService.ObjectStoreServiceOptions.AliyunOSS;

            var tempToken = _oSSService.GetObjectStoreTempToken();

            var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint,
               tempToken.AliyunOSS.AccessKeyId,
                tempToken.AliyunOSS.AccessKeySecret,
                tempToken.AliyunOSS.SecurityToken);



            var folderList = new List<string>();


            try
            {
                ObjectListing objectListing = null;
                string nextMarker = null;
                do
                {
                    // 使用 prefix 模拟目录结构,设置 MaxKeys 和 NextMarker
                    objectListing = _ossClient.ListObjects(new Aliyun.OSS.ListObjectsRequest(aliConfig.BucketName)
                    {
                        Prefix = "",    // 根目录,留空即可
                        Delimiter = "/", // 使用 "/" 来区分目录
                        MaxKeys = 100,
                        Marker = nextMarker
                    });

                    folderList.AddRange(objectListing.CommonPrefixes.Select(t => t.Trim('/')).ToList());


                    // 设置 NextMarker 以获取下一页的数据
                    nextMarker = objectListing.NextMarker;

                } while (objectListing.IsTruncated);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }


            //清理项

            var needDeleteTrialIdList = folderList.Except(trialIdExistList).ToList();

            #endregion

            await _oSSService.DeleteFromPrefix($"{rootFolder}");

            return ResponseOutput.Ok();
        }


        /// <summary>
        /// 用户多账号,初次维护数据
        /// </summary>
        /// <returns></returns>
        public async Task<IResponseOutput> UserMutiAccount([FromServices] IRepository<IdentityUser> _identityUserRepository)
        {
            _userInfo.IsNotNeedInspection = true;

            if ((await _identityUserRepository.FirstOrDefaultAsync()) == null)
            {
                var userList = _userRoleRepository.Where().ToList();

                foreach (var item in userList.GroupBy(t => t.EMail.Trim()))
                {
                    var emailUserIdList = item.Select(t => t.Id).ToList();

                    var identityUserId = NewId.NextSequentialGuid();

                    var identityUser = _mapper.Map<IdentityUser>(item.FirstOrDefault());

                    identityUser.Id = identityUserId;

                    await _identityUserRepository.AddAsync(identityUser);

                    await _userRoleRepository.BatchUpdateNoTrackingAsync(t => emailUserIdList.Contains(t.Id), u => new UserRole() { IdentityUserId = identityUserId });
                }

                await _identityUserRepository.SaveChangesAsync();
            }

    //        UPDATE[User]
    //SET
    //    UserName = IdentityUser.UserName,
    //    FirstName = IdentityUser.FirstName,
    //LastName = IdentityUser.LastName,
    //     EMail = IdentityUser.EMail
    //FROM[User]
    //INNER JOIN IdentityUser
    //ON[User].IdentityUserId = IdentityUser.Id



            return ResponseOutput.Ok();
        }

        /// <summary>
        /// 项目用户 维护数据
        /// </summary>
        /// <param name="_trialIdentityUserRepository"></param>
        /// <returns></returns>
        public async Task<IResponseOutput> UserTrialUser([FromServices] IRepository<TrialIdentityUser> _trialIdentityUserRepository, [FromServices] IRepository<TrialUserRole> _trialUserRoleReposiotry)
        {
            _userInfo.IsNotNeedInspection = true;


            if ((await _trialIdentityUserRepository.FirstOrDefaultAsync()) == null)
            {
                var list = _trialUserRoleReposiotry.Where().Select(t => new { t.TrialId, t.UserRole.IdentityUserId, t.UserId, t.JoinTime, t.RemoveTime }).ToList();


                foreach (var item in list.GroupBy(t => new { t.IdentityUserId, t.TrialId }))
                {

                    var id = NewId.NextSequentialGuid();

                    var userRoleList = item.ToList();

                    var userIdList = item.Select(t => t.UserId).ToList();

                    var first = userRoleList.First();

                    var haveJoin = userRoleList.Any(t => t.JoinTime != null);

                    if (haveJoin)
                    {
                        await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { Id = id, IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, JoinTime = userRoleList.Min(t => t.JoinTime) });

                    }
                    else
                    {
                        await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser() { Id = id, IdentityUserId = item.Key.IdentityUserId, TrialId = item.Key.TrialId, RemoveTime = userRoleList.Max(t => t.RemoveTime) });
                    }

                    await _trialUserRoleReposiotry.BatchUpdateNoTrackingAsync(t => t.TrialId == item.Key.TrialId && userIdList.Contains(t.UserId), u => new TrialUserRole() { TrialUserId = id });

                }

                await _trialIdentityUserRepository.SaveChangesAsync();
            }



            return ResponseOutput.Ok();
        }

        /// <summary>
        /// 外部人员 中心调研人员维护
        /// </summary>
        /// <param name="_trialIdentityUserRepository"></param>
        /// <param name="_trialUserRoleReposiotry"></param>
        /// <returns></returns>
        [UnitOfWork]
        public async Task<IResponseOutput> ExternalTrialUser(
            [FromServices] IRepository<TrialSiteUserSurvey> _trialSiteUserSurveyRepository,
            [FromServices] IRepository<TrialExternalUser> _trialExternalUserReposiotry,
            [FromServices] IRepository<UserRole> _userRoleRepository)
        {
            var list = _userRoleRepository.Select(t => new { t.Id, t.IdentityUserId }).ToList();

            foreach (var item in list.GroupBy(t => t.IdentityUserId))
            {
                var userRoleIdList = item.Select(t => t.Id).ToList();

                var identityUserId = item.Key;

                await _trialSiteUserSurveyRepository.BatchUpdateNoTrackingAsync(t => userRoleIdList.Contains(t.SystemUserId.Value), u => new TrialSiteUserSurvey() { SystemUserId = identityUserId });

                await _trialExternalUserReposiotry.BatchUpdateNoTrackingAsync(t => userRoleIdList.Contains(t.SystemUserId), u => new TrialExternalUser() { SystemUserId = identityUserId });

            }

            return ResponseOutput.Ok();
        }


        [LowerCamelCaseJson]
        public class TestModel
        {
            public Guid TestId { get; set; }

            public string? TestName { get; set; }

        }


        public class TestModel2
        {
            public Guid TestId { get; set; }

            public string TestName { get; set; }
        }

        public async Task<IResponseOutput> TestAutoEncretpt([FromServices] IRepository<TestLength> _testLengthRepository)
        {
            await _testLengthRepository.AddAsync(new TestLength() { Name = "zhouhang1" });
            await _testLengthRepository.AddAsync(new TestLength() { Name = "hewentao" });

            await _testLengthRepository.SaveChangesAsync();
            var list = _testLengthRepository.Where().ToList();

            var exist = await _testLengthRepository.AnyAsync(t => t.Name == "zhouhang1");

            return ResponseOutput.Ok(list, exist);

        }



        public async Task<IResponseOutput> TestJson()
        {
            throw new BusinessValidationFailedException("传统控制器异常");

            var model1 = new TestModel() { TestId = NewId.NextSequentialGuid(), TestName = null };
            var model2 = new TestModel2() { TestId = NewId.NextSequentialGuid(), TestName = "test2" };



            var model4 = _mapper.Map(model1, model2);


            await _trialBodyPartRepository.FirstOrDefaultAsync();

            await _trialBodyPartRepository.Where(t => t.Trial.Id == Guid.Empty).FirstOrDefaultAsync();

            return ResponseOutput.Ok(new TestModel(), IRCEmailPasswordHelper.GenerateRandomPassword(10));
        }

        public string TestHoliday(DateTime startdate, DateTime endDate)
        {
            var timeSpan = HolidayHelper.GetChinaWorkTimeSpan(startdate, endDate);

            _userRoleRepository.Where(t => t.Id == _userInfo.UserRoleId).Select(t => t.FullName).FirstOrDefault();

            return $"{timeSpan.Days}天,{timeSpan.Hours}小时{timeSpan.Minutes}分钟{timeSpan.Seconds}秒";
        }

        public async Task<IResponseOutput> TestEFcore8()
        {
            var systemDocQuery = from sysDoc in _systemDocumentRepository.Where()

                                 join confirm in _systemDocConfirmedUserRepository.Where().Where(t => t.ConfirmTime != null) on sysDoc.Id equals confirm.SystemDocumentId
                                 select new UnionDocumentWithConfirmInfoView()
                                 {
                                     IsSystemDoc = true,

                                     Id = sysDoc.Id,
                                     CreateTime = sysDoc.CreateTime,
                                     IsDeleted = sysDoc.IsDeleted,
                                     SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes,
                                     Name = sysDoc.Name,
                                     Path = sysDoc.Path,
                                     FileType = _userInfo.IsEn_Us ? sysDoc.FileType.Value : sysDoc.FileType.ValueCN,
                                     FileTypeId = sysDoc.FileTypeId,
                                     UpdateTime = sysDoc.UpdateTime,


                                     ConfirmUserId = confirm.ConfirmUserId,
                                     ConfirmTime = confirm.ConfirmTime,
                                     RealName = confirm.ConfirmUser.FullName,
                                     UserName = confirm.ConfirmUser.UserName,
                                     UserTypeId = confirm.ConfirmUser.UserTypeId,
                                     UserTypeShortName = confirm.ConfirmUser.UserTypeRole.UserTypeShortName,

                                     FullFilePath = sysDoc.Path
                                 };

            var list = systemDocQuery.OrderBy(t => t.ConfirmUserId).ThenBy(t => t.ConfirmTime).ToList();

            //var aa= _dicRepository._dbContext.Subject.Where(t => t.Id == Guid.Empty).ExecuteUpdate("FirstName","ddd");

            //await _repository.BatchUpdateAsync<Subject>(t => t.Id == Guid.Empty, u => new Subject() { FirstName = "fddd", LastName = "sss", UpdateTime = DateTime.Now });

            //await _subjectRepository.Where().ExecuteUpdateAsync(t => t.SetProperty(t => t.UpdateTime, u => DateTime.Now));

            return ResponseOutput.Ok(list);
        }
        // 设置 Ne

        [AllowAnonymous]
        public async Task<IResponseOutput> TestMinIO([FromServices] IOSSService oSSService)
        {

            var str = await oSSService.GetSignedUrl("/01000000-c0a8-0242-1c98-08dc7ebcd37d/Read/01000000-c0a8-0242-1c98-08dc7ebcd37d/Visit/1716872544006_1716872544003.png");


            //await oSSService.UploadToOSSAsync("C:\\Users\\Administrator\\Desktop\\TrialSiteUserImportTemplate.xlsx", "myfolder");

            //await oSSService.DownLoadFromOSSAsync("/myfolder/TrialSiteUserImportTemplate.xlsx", "C:\\Users\\Administrator\\Desktop\\aws.xlsx");

            return ResponseOutput.Ok(str);
        }

        [AllowAnonymous]
        public async Task<IResponseOutput> TestDistributedLock()
        {

            await _userRoleRepository.Where().Select(t => t.FullName).FirstNotNullAsync();

            Console.WriteLine($"我进来了当前值是:" + IntValue);
            _logger.LogWarning($"我进来了当前值是:" + IntValue);

            var @lock = _distributedLockProvider.CreateLock($"UserAccount");

            using (await @lock.AcquireAsync())
            {
                await Task.Delay(4);
                IntValue--;

                _logger.LogWarning(IntValue.ToString());
                Console.WriteLine(IntValue);
            }

            return ResponseOutput.Ok(IntValue);
        }


        [AllowAnonymous]
        public async Task<IResponseOutput> InternationazitionInit()
        {


            var rows = await MiniExcel.QueryAsync<InternationalizationAddOrEdit>(@"C:\Users\Administrator\Desktop\i18n-new.xlsx");

            rows = rows.Where(t => !string.IsNullOrEmpty(t.Code)).ToList();

            foreach (var row in rows)
            {
                await _internationalizationRepository.InsertOrUpdateAsync(row);

            }

            await _internationalizationRepository.SaveChangesAsync();

            return ResponseOutput.Ok();
        }


        public class TestEncrept
        {
            public string Name { get; set; }

            public string Code { get; set; }
        }

        public IResponseOutput TestEncreptTest(TestEncrept testModel)
        {
            return ResponseOutput.Ok(testModel);
        }

        //etx5EzcF9XWA6ICzQB5ywEEextuhmUwaHM2TmyyCC8Q=
        [HttpPut("{name}/{code}")]
        public IResponseOutput TestEncreptTest2(string name, string code)
        {
            return ResponseOutput.Ok($"name:{name} Code: {code}");
        }

        public IResponseOutput TestEncreptTest3(string name, string Code)
        {
            return ResponseOutput.Ok($"name:{name} Code: {Code}");
        }


        [UnitOfWork]
        public async Task<string> Get([FromServices] IOptionsMonitor<IRCEncreptOption> _encreptResponseMonitor)
        {
            var _IRCEncreptOption = _encreptResponseMonitor.CurrentValue;

            var publicKey = Encoding.UTF8.GetString(Convert.FromBase64String(_IRCEncreptOption.Base64RSAPublicKey));
            var privateKey = Encoding.UTF8.GetString(Convert.FromBase64String(_IRCEncreptOption.Base64RSAPrivateKey));

            Console.WriteLine(RSAEncryption.Encrypt(publicKey, MD5Helper.Md5("123456")));




            //U2FsdGVkX1+atIRsUP6uhWIMHIVmn7U2sy4HlgWiWJG1qc0WdYyQqzgTJ1JLeQGHvYrIYm90/YCkBYclYbnm1g==


            string plainText = "Hello, BouncyCastle!";
            string key = "12345678901234567890123456789012";  // AES 密钥长度应为 16 字节(128 位)
            string iv = "your-iv-12345678";       // IV 长度为 16 字节


            var encreptMd5 = AesEncryption.Encrypt(MD5Helper.Md5("123456"), key);
            Console.WriteLine(encreptMd5);
            var decrept = AesEncryption.Decrypt(encreptMd5, key);


            Console.WriteLine();

            Console.WriteLine(AesEncryption.Encrypt("cyldev", key));

            Console.WriteLine($"原始文本: {plainText}");

            // 加密
            string encrypted = AesEncryption.Encrypt(plainText, key, iv);
            Console.WriteLine($"加密后的数据: {encrypted}");

            // 解密
            string decrypted = AesEncryption.Decrypt(encrypted, key, iv);
            Console.WriteLine($"解密后的数据: {decrypted}");




            Console.WriteLine($"原始文本: {plainText}");

            // 加密
            string encrypte = AesEncryption.Encrypt(plainText, key);
            Console.WriteLine($"加密后的数据: {encrypte}");

            // 解密
            string decrypte = AesEncryption.Decrypt(encrypte, key);
            Console.WriteLine($"解密后的数据: {decrypte}");


            //// Generate RSA keys
            //var keyPair = RSAEncryption.GenerateRSAKeyPair(2048);

            //// Export the public and private keys to PEM format
            //string publicKey = RSAEncryption.ExportPublicKey(keyPair.Public);
            //string privateKey = RSAEncryption.ExportPrivateKey(keyPair.Private);

            //Console.WriteLine("Public Key:");
            //Console.WriteLine(publicKey);
            //Console.WriteLine($"{Convert.ToBase64String(Encoding.UTF8.GetBytes(publicKey))}");
            //Console.WriteLine("\nPrivate Key:");
            //Console.WriteLine(privateKey);
            //Console.WriteLine($"{Convert.ToBase64String(Encoding.UTF8.GetBytes(privateKey))}");





            Console.WriteLine("Public Key:");
            Console.WriteLine(publicKey);
            Console.WriteLine("\nPrivate Key:");
            Console.WriteLine(privateKey);

            Console.WriteLine("encrept sys Key:");
            Console.WriteLine($"\n{RSAEncryption.Encrypt(publicKey, key)}");

            // Data to encrypt
            string dataToEncrypt = "Hello, RSA!";
            Console.WriteLine("\nOriginal Data: " + dataToEncrypt);

            // Encrypt the data
            var encryptedData = RSAEncryption.Encrypt(publicKey, dataToEncrypt);
            Console.WriteLine("\nEncrypted Data: " + encryptedData);

            // Decrypt the data
            string decryptedData = RSAEncryption.Decrypt(privateKey, encryptedData);
            Console.WriteLine("\nDecrypted Data: " + decryptedData);


            return "测试自动发布--再次提交";
        }



        [AllowAnonymous]
        public async Task<string> testDoc([FromServices] IWebHostEnvironment env, string email)
        {
            #region DocX  测试
            //using (DocX document = DocX.Load("C:\\Users\\hang\\Desktop\\test.docx"))
            //{
            //    // 查找书签
            //    var bookmarkCn_Start = document.Bookmarks.FirstOrDefault(b => b.Name == "zh_cn");
            //    var bookmarkEn_Start = document.Bookmarks.FirstOrDefault(b => b.Name == "en_us");

            //    if (bookmarkCn_Start != null && bookmarkEn_Start != null)
            //    {
            //        // 获取书签的起始位置
            //        int bookmarkCNStartPos = bookmarkCn_Start.Paragraph.StartIndex;

            //        var bookmarkENStartPos = bookmarkEn_Start.Paragraph.StartIndex;

            //        //    // 创建一个要删除段落的列表
            //        List<Paragraph> paragraphsToRemove = new List<Paragraph>();

            //        foreach (var item in document.Paragraphs)
            //        {

            //            //中文模板在前,英文在后,英文模板,就删除英文之前的,中文模板就删除英文之后的
            //            //_userInfo.IsEn_Us?  item.EndIndex< bookmarkENStartPos :item.StartIndex>= bookmarkENStartPos
            //            if (item.StartIndex>= bookmarkENStartPos)
            //            {
            //                paragraphsToRemove.Add(item);

            //            }
            //        }

            //        foreach (var paragraph in paragraphsToRemove) 
            //        {
            //            document.RemoveParagraph(paragraph);
            //        }

            //    }

            //    // 保存修改
            //    document.SaveAs("C:\\Users\\hang\\Desktop\\test1.docx");
            //}
            #endregion

            using (FileStream fs = new FileStream("C:\\Users\\hang\\Desktop\\test.docx", FileMode.Open, FileAccess.Read))
            {
                XWPFDocument doc = new XWPFDocument(fs);


                // 查找包含指定书签的段落及其索引
                var bookmarkParagraph = doc.Paragraphs
                    .FirstOrDefault(p => p.GetCTP().GetBookmarkStartList().Any(b => b.name == "en_us"));


                if (bookmarkParagraph != null)
                {
                    int bookmarkIndex = doc.Paragraphs.IndexOf(bookmarkParagraph);

                    // 删除书签之后的所有段落
                    for (int i = doc.Paragraphs.Count - 1; i >= bookmarkIndex; i--)
                    {
                        doc.RemoveBodyElement(i);
                    }

                }
                else
                {
                    throw new BusinessValidationFailedException("word 模板没有英文书签");
                }

                // 创建一个要删除段落的列表

                //XWPFParagraph bookmarkParagraph = null;

                //foreach (var paragraph in doc.Paragraphs)
                //{

                //    foreach (var bookmark in paragraph.GetCTP().GetBookmarkStartList())
                //    {
                //        if (bookmark.name == "en_us")
                //        {
                //            bookmarkParagraph = paragraph;
                //            break;
                //        }
                //    }
                //}




                //// 从书签所在段落开始,删除之前的所有段落
                //for (int i = bookmarkIndex - 1; i >= 0; i--)
                //{
                //    doc.RemoveBodyElement(i);
                //}



                using (FileStream outStream = new FileStream("C:\\Users\\hang\\Desktop\\test1.docx", FileMode.Create, FileAccess.Write))
                {
                    doc.Write(outStream);
                }
            }


            return "hiddenEmail";
        }


        [AllowAnonymous]
        public async Task<object> GetEnvironmentName([FromServices] IWebHostEnvironment env)
        {
            //var a = IdentifierHelper.CreateGuid("123456");

            //var k = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("123456"));

            //var c = MD5Helper.Md5("123456");



            //return new { env.EnvironmentName, EMailConfig = _systemEmailConfig.CurrentValue, BasicConfig = _basicConfig.CurrentValue };


            // Load a document.
            //using (var document = DocX.Load(Path.Combine(_hostEnvironment.ContentRootPath, "ReplaceText.docx")))
            //{
            //    // Check if all the replace patterns are used in the loaded document.
            //    if (document.FindUniqueByPattern(@"<[\w \=]{4,}>", RegexOptions.IgnoreCase).Count > 0)
            //    {
            //        // Do the replacement of all the found tags and with green bold strings.
            //        //for (int i = 0; i < _replacePatterns.Count; ++i)
            //        //{
            //        //    document.ReplaceText("<(.*?)>", TestService.ReplaceFunc, false, RegexOptions.IgnoreCase, new Formatting() { Bold = true, FontColor = System.Drawing.Color.Green });
            //        //}
            //        // Save this document to disk.

            //        document.ReplaceText("test", "jfdksajfkljflsdjf", false, RegexOptions.IgnoreCase, new Formatting() { Bold = true, FontColor = System.Drawing.Color.Green });
            //        document.SaveAs("ReplacedText.docx");
            //    }

            //}
            //return await NpoiWordHelper.TemplateExportWordAsync(Path.Combine(_hostEnvironment.ContentRootPath, "ReplaceText.docx"), new { test = "xiugai", ZZZZ = "ModiffyZZZZ" }, null, _hostEnvironment);

            //_cache.SetString("test" , "cacheStr");

            //var aa=  _trialRepository.Where(t => t.Id == Guid.Empty).First();

            //var aaabb = _trialRepository.BatchDeleteNoTrackingAsync(t => t.Id == Guid.Empty).Result;

            //var aaaa = _dicRepository.BatchDeleteNoTrackingAsync(t => t.Id == Guid.Empty).Result;


            //var waitModifyEntity = _dicRepository.FirstOrDefaultAsync(t => t.Id == Guid.Parse("e2b97a6c-35a6-4aa3-7f27-08da13ab33ff")).GetAwaiter().GetResult();

            //var tt = _dicRepository.UpdateAsync(waitModifyEntity, t => new Dictionary() { Description = "xxxxx" }, true).Result;



            //var tt2 = _trialRepository.UpdatePartialFromQueryAsync(Guid.Parse("543d0000-3e10-0016-77e9-08da2827228a"), t => new Trial() { Indication = "WCH测试稽查002" }, true).Result;




            //var d = _userRoleRepository.Where(t => t.FullName.Contains("cc")).Select(t => t.FullName).FirstOrDefault();
            //var c = _dicRepository.Where(t => t.ParentId != null).Select(t => t.MappedValue).First();
            //CultureInfo culture = CultureInfo.CurrentUICulture;

            //var dd = _dicRepository.UpdatePartialFields(Guid.Parse("8a90c96e-0776-4f7b-82a6-18933d339584"),
            //        u => new Dictionary() { ParentId = null, Code = "test" }, true);


            //var ggggg = _dicRepository.UpdateFromQueryAsync(t => t.ParentId == Guid.Parse("8a90c96e-0776-4f7b-82a6-18933d339584"), u=>new Dictionary(){Code = "test"}).Result;

            //var ddd = _dicRepository.BatchUpdateAsync(t => t.Id == Guid.Parse("8a90c96e-0776-4f7b-82a6-18933d339584"),
            //   u => new Dictionary() { /*ParentId = null,*/ Code = "test" }).Result;


            //var  aaaaa= _trialRepository.BatchUpdateAsync(t => t.Id == Guid.Empty,
            //    u => new SubjectVisit() { CurrentActionUserId = null }).Result;


            //var d = _dicRepository.UpdateFromDTOAsync(new AddOrEditBasicDic() { Id = Guid.Parse("60d86683-c33b-4349-b672-08da1e91b622"), ParentId = null, ChildGroup = null, Code = null }, true, true).Result;
            //var a = 123;

            throw new BusinessValidationFailedException(_localizer["TrialIsDoubleCheck{0}", "测试"]);

            var b = _localizer["test{0}", "测试"];
            return _localizer["test{0}", "测试"];


            //var list = _subjectVisitRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.VisitTaskList).ToList();

            //var list2 = _visitTaskRepository.Where(t => t.Id == Guid.NewGuid()).Select(t => t.SourceSubjectVisit).ToList();

            //var list3 = _visitTaskRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SourceSubjectVisit.VisitTaskList).ToList();
            //var list2 = _subjectRepository.Where(t => t.Id == Guid.NewGuid()).SelectMany(t => t.SubjectVisitTaskList).ToList();
            //return _userInfo.LocalIp;
        }



        public async Task<IResponseOutput> ModifyTrialBodyPart()
        {

            var searchList = await _dicRepository.Where(t => t.Parent.Code == "BodyPart" && t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();

            var needAddBodyPartList = searchList.Select(t => new TrialBodyPart() { Code = t.Code, Name = t.Value, NameCN = t.ValueCN });

            var trialIds = _trialRepository.Where(t => !t.TrialBodyPartList.Any()).Select(t => t.Id).ToList();

            foreach (var trialId in trialIds)
            {
                var tempList = needAddBodyPartList.Clone();

                tempList.ForEach(t => t.TrialId = trialId);

                await _trialBodyPartRepository.AddRangeAsync(tempList);
            }

            await _dicRepository.SaveChangesAsync();
            return ResponseOutput.Ok();
        }

        #region 历史维护
        /// <summary>
        /// 维护临床数据  --一定要在同步表前同步数据才行
        /// </summary>
        /// <returns></returns>
        [AllowAnonymous]
        public async Task<IResponseOutput> ModifyClinicalDataTable()
        {
            var needAddList = _clinicalDataTrialSetRepository.Where(t => t.CriterionEnumListStr != String.Empty && t.TrialClinicalDataSetCriteriaList.Count() == 0).ToList();


            //遍历项目
            foreach (var needAddTrialGroup in needAddList.GroupBy(t => t.TrialId))
            {
                //找到项目存在的项目标准

                var trialCritrialList = _readingQuestionCriterionTrialRepository.Where(t => t.TrialId == needAddTrialGroup.Key).ToList();

                //遍历项目下的临床数据
                foreach (var needAddTrial in needAddTrialGroup)
                {

                    //遍历每条临床数据配置的标准

                    foreach (var item in needAddTrial.CriterionEnumList)
                    {
                        var find = trialCritrialList.Where(t => (int)t.CriterionType == item).FirstOrDefault();

                        if (find != null)
                        {
                            await _trialClinicalDataSetCriterionRepository.AddAsync(new TrialClinicalDataSetCriterion() { TrialClinicalDataSetId = needAddTrial.Id, TrialReadingCriterionId = find.Id });
                        }
                    }
                }
            }
            await _trialClinicalDataSetCriterionRepository.SaveChangesAsync();
            return ResponseOutput.Ok();
        }


        /// <summary>
        /// 维护OSS 影像数据
        /// </summary>
        /// <returns></returns>
        [AllowAnonymous]
        [UnitOfWork]
        public async Task<IResponseOutput> OldLocalImageResizeJpg([FromServices] IOSSService oSSService, [FromServices] IWebHostEnvironment _hostEnvironment)
        {

            var aliConfig = oSSService.ObjectStoreServiceOptions.AliyunOSS;
            var _ossClient = new OssClient(aliConfig.EndPoint, aliConfig.AccessKeyId, aliConfig.AccessKeySecret);

            var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);

            var studyList = _dicomStudyRepository.Where(t => t.SeriesList.Any(t => t.ImageResizePath.Length < 10)).Select(t => new { t.TrialId, t.Subject.TrialSiteId, t.SubjectId, t.SubjectVisitId, t.Id }).ToList();

            foreach (var studyitem in studyList)
            {

                var relativePath = $"{studyitem.TrialId}/{studyitem.TrialSiteId}/{studyitem.SubjectId}/{studyitem.SubjectVisitId}/{StaticData.Folder.DicomFolder}/{studyitem.Id}/";

                try
                {
                    string nextMarker = null;
                    do
                    {
                        // 使用 prefix 模拟目录结构,设置 MaxKeys 和 NextMarker
                        var objectListing = _ossClient.ListObjects(new ListObjectsRequest(aliConfig.BucketName)
                        {
                            Prefix = relativePath,
                            MaxKeys = 1000,
                            Marker = nextMarker
                        });

                        var jpgInfoList = objectListing.ObjectSummaries
                                                     .Where(summary => summary.Key.EndsWith(".jpg"))
                                                     .Select(summary =>
                                                     {
                                                         string fileName = summary.Key.Split('/').Last(); // 提取文件夹名
                                                         return new
                                                         {

                                                             Key = summary.Key,
                                                             InstanceId = Guid.TryParse(
                                                                 fileName.Split('.')[0],
                                                                 out Guid instanceId)
                                                                 ? instanceId
                                                                 : Guid.Empty
                                                         };
                                                     })
                                                     .Where(info => info.InstanceId != Guid.Empty)
                                                     .ToList();

                        foreach (var jpg in jpgInfoList)
                        {
                            var seriesId = _dicomInstanceRepository.Where(t => t.Id == jpg.InstanceId).Select(t => t.SeriesId).FirstOrDefault();

                            await _dicomSeriesRepository.BatchUpdateNoTrackingAsync(t => t.Id == seriesId, t => new DicomSeries() { ImageResizePath = "/" + jpg.Key });
                        }

                        // 设置 NextMarker 以获取下一页的数据
                        nextMarker = objectListing.NextMarker;

                    } while (!string.IsNullOrEmpty(nextMarker));
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Error: {ex.Message}");
                }

                await _dicomStudyRepository.SaveChangesAsync();
            }



            return ResponseOutput.Ok();
        }


        #endregion



    }

    public class TestModel
    {

        //[Required]
        public string Id { get; set; }

        public string Name { get; set; }

        public DateTime? Time { get; set; }
    }
}


namespace Localization
{
    public class SharedResource
    {
    }
}