using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using NPOI.SS.UserModel;
using NPOI.Util;
using NPOI.XSSF.UserModel;
using NPOI.XWPF.UserModel;
using Ropin.Inspection.Api.Common;
using Ropin.Inspection.Api.Controllers;
using Ropin.Inspection.Common.Helper;
using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Common;
using Ropin.Inspection.Service;
using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Security.Claims;
using log4net;

namespace Ropin.Inspection.Api
{

    public class TdevDevStoreDocController : BaseController
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(TdevDevStoreDocController));
        public ILogger<TdevDevStoreDocController> _logger { get; }
        private readonly ITdevDevStoreDocService _TdevDevStoreDocService;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="TdevDevStoreDocService"></param>
        /// <param name="logger"></param>
        public TdevDevStoreDocController(ITdevDevStoreDocService TdevDevStoreDocService, ILogger<TdevDevStoreDocController> logger)
        {
            _TdevDevStoreDocService = TdevDevStoreDocService;
            _logger = logger;
        }

        
        /// <summary>
        /// 创建业主设备文档
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        [HttpPost("CreateDevStoreDocAsync")]
        public async Task<ApiResult> CreateDevStoreDocAsync(TdevDevStoreDocViewModel content)
        {
            if (content == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                await _TdevDevStoreDocService.CreateOneAsync(content);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }

        /// <summary>
        /// 删除业主设备文档
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("DeleteDevStoreDocAsync/{id}")]
        public async Task<ApiResult> DeleteDevStoreDocAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreDocService.DeleteAsync(id);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }

        /// <summary>
        /// 更新业主设备文档
        /// </summary>
        /// <param name="id"></param>
        /// <param name="updateModel"></param>
        /// <returns></returns>
        [HttpPut("UpdateDevStoreDocAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> UpdateDevStoreDocAsync(string id, TdevDevStoreDocViewModel updateModel)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                await _TdevDevStoreDocService.UpdateAsync(id, updateModel);
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
            return new ApiResult(ReturnCode.Success);
        }


        /// <summary>
        /// 通过id获取业主设备文档信息
        /// </summary>
        /// <returns></returns>
        [HttpPost("GetDevStoreDocAsync")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreDocAsync(TdevDevStoreDocSearchModel searchModel)
        {
            if (searchModel == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                //var content = await _TdevDevStoreDocService.GetConditionAsync(new TdevDevStoreDocSearchModel { C_ID = id });
                //var dev = content.FirstOrDefault();

                //return new ApiResult<TdevDevStoreDocViewModel>(dev);
                var contentList = await _TdevDevStoreDocService.GetConditionAsync(searchModel);
                return new ApiResult<PagesModel<TdevDevStoreDocViewModel>>(new PagesModel<TdevDevStoreDocViewModel>(contentList, searchModel));
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }

        /// <summary>
        ///  获取设备文档(包括关联的模板文档)
        /// </summary>
        /// <returns></returns>
        [HttpPost("GetDevFile")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevFile(TdevDevStoreDocSearchModel searchModel)
        {
            if (searchModel == null)
            {
                return new ApiResult(ReturnCode.ArgsError);
            }
            try
            {
                var contentList = await _TdevDevStoreDocService.GetDevFile(searchModel);
                return new ApiResult<PagesModel<TdevDevStoreDocViewModel>>(new PagesModel<TdevDevStoreDocViewModel>(contentList, searchModel));
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }
        }
        /// <summary>
        /// 通过业主设备id获取业主设备文档信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("GetDevStoreDocByCodeAsync/{id}")]
        [AllowAnonymous]
        public async Task<ApiResult> GetDevStoreDocByCodeAsync(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return new ApiResult(ReturnCode.GeneralError);
            }
            try
            {
                var content = await _TdevDevStoreDocService.GetConditionAsync(new TdevDevStoreDocSearchModel { C_DevStoreCode = id });
                var dev = content.ToList();

                return new ApiResult<IEnumerable<TdevDevStoreDocViewModel>>(new List<TdevDevStoreDocViewModel>(dev));
            }
            catch (Exception ex)
            {
                return new ApiResult(ReturnCode.GeneralError, ex.Message);
            }

        }


        /// <summary>
        /// 发送邮件(附件设备文档)
        /// </summary>
        /// <param name="searchModel"></param>
        /// <returns></returns>
        [HttpPost("SendDevStoreDocToEmail")]
        public async Task SendDevStoreDocToEmail(SendDevStoreDocToEmailModel searchModel)
        {
            log.Info("设备文档导出压缩文件");
            if (searchModel == null || string.IsNullOrEmpty(searchModel.C_DevStoreCode))
            {
                return;
            }
            try
            {
                var contentList = await _TdevDevStoreDocService.GetDevFile(searchModel);
                if (contentList==null|| contentList.Count()==0)
                {
                    return;
                }
                string zip = @"wwwroot\\ZipFile";
                if (!System.IO.Directory.Exists(zip))
                {
                    Directory.CreateDirectory(zip);
                }
                string zipPaht = zip + "\\规范标准文档_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip";
                using (ZipArchive zipArchive = ZipFile.Open(zipPaht, ZipArchiveMode.Create))
                {
                    foreach (var item in contentList)
                    {
                        if (item != null)
                        {
                            var direPath = Directory.GetCurrentDirectory();
                            var fileUrl = direPath + item.C_Url;//Path.Combine(direPath, item.C_Url);
                            log.Info($"设备文档导出压缩文件,项目路径{direPath},文件全路径地址:{fileUrl}");
                            if (System.IO.File.Exists(fileUrl))
                            {
                                log.Info($"设备文档导出压缩文件,文件地址:{fileUrl},判断为存在");
                                string fileName = Path.GetFileName(fileUrl);
                                zipArchive.CreateEntryFromFile(fileUrl, fileName);
                            }
                        }
                    }
                }
                var zipFile1 = new FileStream(zipPaht, FileMode.Open);
                string emailName = $"{searchModel.DevName}规范标准文档";
                EmailHelper.SendEmail(searchModel.Mails, emailName, "", "报表见附件", $"{emailName}.zip", "application/zip", zipFile1);

                System.IO.File.Delete(zipPaht);

            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}