using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using COSXML.Model;
using COSXML.CosException;


namespace COSXML.Transfer
{

    /// <summary>
    /// 高级传输,提供更方便的对象上传、下载、拷贝功能
    /// </summary>
    public sealed class TransferManager
    {
        private TransferConfig transferConfig;

        private CosXml cosXml;

        /// <summary>
        /// 初始化方法
        /// </summary>
        /// <param name="cosXmlServer">COSXML服务</param>
        /// <param name="transferConfig">高级传输设置</param>
        public TransferManager(CosXml cosXmlServer, TransferConfig transferConfig)
        {

            if (cosXmlServer == null)
            {
              //  throw new ArgumentNullException("CosXmlServer = null");
            }

            if (transferConfig == null)
            {
             //   throw new ArgumentNullException("TransferConfig = null");
            }

            this.transferConfig = transferConfig;
            //COSXMLTask.InitCosXmlServer(cosXmlServer);
            this.cosXml = cosXmlServer;
        }

        /// <summary>
        /// 上传对象,封装了简单上传、分片上传功能。
        /// </summary>
        /// <param name="uploader"></param>
        [Obsolete("方法已废弃,请使用 UploadAsync 方法实现异步调用。")]
        public void Upload(COSXMLUploadTask uploader)
        {
            uploader.InitCosXmlServer(cosXml);
            uploader.SetDivision(transferConfig.DivisionForUpload, transferConfig.SliceSizeForUpload);
            uploader.Upload();
        }

        /// <summary>
        /// 异步上传对象,封装了简单上传、分片上传功能。
        /// </summary>
        /// <param name="uploader"></param>
        /// <returns></returns>
        public Task<COSXMLUploadTask.UploadTaskResult> UploadAsync(COSXMLUploadTask uploader)
        {
            var task = uploader.AsyncTask<COSXMLUploadTask.UploadTaskResult>();
            Upload(uploader);
            return task;
        }

        /// <summary>
        /// 下载对象
        /// </summary>
        /// <param name="downloader"></param>
        [Obsolete("方法已废弃,请使用 DownloadAsync 方法实现异步调用。")]
        public void Download(COSXMLDownloadTask downloader)
        {
            downloader.InitCosXmlServer(cosXml);
            downloader.SetSliceSize(transferConfig.SliceSizeForDownload);
            downloader.SetDivisionSize(transferConfig.DivisionForDownload);
            downloader.Download();
        }

        /// <summary>
        /// 异步下载对象
        /// </summary>
        /// <param name="downloader"></param>
        /// <returns></returns>
        public Task<COSXMLDownloadTask.DownloadTaskResult> DownloadAsync(COSXMLDownloadTask downloader)
        {
            var task = downloader.AsyncTask<COSXMLDownloadTask.DownloadTaskResult>();
            Download(downloader);
            return task;
        }

        /// <summary>
        /// 拷贝对象,封装了简单拷贝、分片拷贝功能。
        /// </summary>
        /// <param name="copy"></param>
        [Obsolete("方法已废弃,请使用 CopyAsync 方法实现异步调用。")]
        public void Copy(COSXMLCopyTask copy)
        {
            copy.InitCosXmlServer(cosXml);
            copy.SetDivision(transferConfig.DdivisionForCopy, transferConfig.SliceSizeForCopy);
            copy.Copy();
        }

        /// <summary>
        /// 异步拷贝对象,封装了简单拷贝、分片拷贝功能。
        /// </summary>
        /// <param name="copyTask"></param>
        /// <returns></returns>
        public Task<COSXMLCopyTask.CopyTaskResult> CopyAsync(COSXMLCopyTask copyTask)
        {
            var task = copyTask.AsyncTask<COSXMLCopyTask.CopyTaskResult>();
            Copy(copyTask);
            return task;
        }
    }

    /// <summary>
    /// 高级传输任务设置
    /// </summary>
    public sealed class TransferConfig
    {
        // 5M
        private long divisionForCopy = 5242880;

        // 2M
        private long sliceSizeForCopy = 2097152;

        // 5M
        private long divisionForUpload = 5242880;

        // 1M
        private long sliceSizeForUpload = 1048576;

        // 20M
        private long divisionForDownload = 20971520;

        // 10M
        private long sliceSizeForDownload = 10485760;

        /// <summary>
        /// 多大的文件会自动使用分片拷贝
        /// </summary>
        /// <value>默认是 5MB</value>
        public long DdivisionForCopy
        {
            get
            {
                return divisionForCopy;
            }
            set { divisionForCopy = value; }
        }

        /// <summary>
        /// 多大的文件会自动使用分片上传
        /// </summary>
        /// <value>默认是 2MB</value>
        public long DivisionForUpload
        {
            get
            {
                return divisionForUpload;
            }
            set { divisionForUpload = value; }
        }

        /// <summary>
        /// 每个分片拷贝任务的分片大小
        /// </summary>
        /// <value>默认是 5MB</value>
        public long SliceSizeForCopy
        {
            get
            {
                return sliceSizeForCopy;
            }
            set { sliceSizeForCopy = value; }
        }

        /// <summary>
        /// 每个分片上传任务的分片大小
        /// </summary>
        /// <value>默认是 1MB</value>
        public long SliceSizeForUpload
        {
            get
            {
                return sliceSizeForUpload;
            }
            set { sliceSizeForUpload = value; }
        }

        /// <summary>
        /// 多大的文件会使用多线程分块下载
        /// </summary>
        /// <value>默认是 20MB</value>
        public long DivisionForDownload
        {
            get
            {
                return divisionForDownload;
            }
            set { divisionForDownload = value; }
        }

        /// <summary>
        /// 分块下载的每个块大小
        /// </summary>
        /// <value>默认是 10MB</value>
        public long SliceSizeForDownload
        {
            get
            {
                return sliceSizeForDownload;
            }
            set { sliceSizeForDownload = value; }
        }
    }
}