
using Tiobon.Core.IServices;
using Tiobon.Core.Model.Models;
using Tiobon.Core.Services.BASE;
using Tiobon.Core.IRepository.Base;
using Microsoft.AspNetCore.Http;
using System.Dynamic;
using SqlSugar;

namespace Tiobon.Core.Services
{
    /// <summary>
    /// 附件 (服务)
    /// </summary>
    public class Ghre_AttachmentServices : BaseServices<Ghre_Attachment, Ghre_AttachmentDto, InsertGhre_AttachmentInput, EditGhre_AttachmentInput>, IGhre_AttachmentServices
    {
        private readonly IBaseRepository<Ghre_Attachment> _dal;
        public Ghre_AttachmentServices(IBaseRepository<Ghre_Attachment> dal)
        {
            this._dal = dal;
            base.BaseDal = dal;
        }

        public async Task<dynamic> UploadVideoAsync(IFormFile file, string fileName, int chunkIndex, int totalChunks, string id)
        {
            dynamic obj = new ExpandoObject();
            string status = "error";
            string message = string.Empty;
            string pathHeader = string.Empty;
            string url = string.Empty;

            try
            {
                var path = $"{$"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}upload{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}";
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);
                using (var stream = File.Create(path + $"{chunkIndex}"))
                {
                    await file.CopyToAsync(stream);
                }

                if (chunkIndex == totalChunks - 1)
                    await FileMerge(id, ".mp4", SnowFlakeSingle.Instance.NextId());

                status = "ok";
            }
            catch (Exception E)
            {
                message = E.Message;
            }
            obj.url = url;
            obj.status = status;
            obj.message = message;
            return obj;
        }

        public static async Task<object> FileMerge(string lastModified, string fileExts, long NewfileName)
        {
            string erro = "";
            bool ok = false;
            try
            {
                string wwwroot = $"{Directory.GetCurrentDirectory()}/wwwroot/";
                var temporary = Path.Combine(wwwroot, lastModified);//临时文件夹
                //fileName = Request.Form["fileName"];//文件名
                string fileExt = fileExts;//获取文件后缀
                var files = Directory.GetFiles(temporary);//获得下面的所有文件
                DirectoryInfo di = new DirectoryInfo(wwwroot + NewfileName + "/");
                if (!di.Exists)
                    di.Create();

                var finalPath = Path.Combine(wwwroot + lastModified + "/", NewfileName + fileExt);//最终的文件名（demo中保存的是它上传时候的文件名，实际操作肯定不能这样）
                var fs = new FileStream(finalPath, FileMode.Create);
                foreach (var part in files.OrderBy(x => x.Length).ThenBy(x => x))//排一下序，保证从0-N Write
                {
                    var bytes = File.ReadAllBytes(part);
                    await fs.WriteAsync(bytes, 0, bytes.Length);
                    bytes = null;
                    //System.IO.File.Delete(part);//删除分块
                }
                fs.Close();

                //Directory.Delete(temporary);//删除文件夹
                ok = true;
            }
            catch (Exception ex)
            {
                erro = ex.Message;
            }
            return ok;
        }
    }
}