using LYFZ.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using HPSocketCS;
using HPSocketCS.Extended;
using LYFZ.Helper;

namespace LYFZ.Network.OssOperation
{
	public class OssProcess
    {
        #region 服务端
        public delegate bool SaveTaskToFile(OssUploadTask uploadTask);

		/// <summary>
		/// 获取oss的分店信息;
		/// </summary>
		/// <returns></returns>
        public static List<OssBranch> GetBranchList()
        {
			string jsonPath =LYFZ.WinAPI.CustomPublicMethod.GetFullDirectoryPath(LYFZ.WinAPI.CustomPublicMethod.BasePath)+ "AliyunOssClient\\branchlist.json";
			if (!File.Exists(jsonPath))
			{
				LYFZ.BLL.BLL_FileLogs.WriteMainLogs("未找到branchlist.json");
				return null;
			}

            try
            {
                string strJson = File.ReadAllText(jsonPath);
                List<OssBranch> osslist = (List<OssBranch>)JsonConvert.DeserializeObject(strJson, typeof(List<OssBranch>));
				return osslist;
            }
            catch(Exception ex)
            {
				BLL.BLL_FileLogs.WriteMainLogs("GetBranchList 失败:" + ex.Message);
            }

            return null;
        }

		/// <summary>
		/// 将任务保存成json文件;
		/// </summary>
		/// <param name="uploadTask"></param>
		public static bool SaveUploadTaskToFile(OssUploadTask uploadTask)
		{
			if ( uploadTask != null)
			{
				try
				{
					string strJson = JsonConvert.SerializeObject(uploadTask);
					// 用订单号+相片类型+分店id来命名任务文件;
					File.WriteAllText(string.Format("{0}AliyunOssClient\\uploadTask\\{1}#{2}.json", LYFZ.WinAPI.CustomPublicMethod.GetFullDirectoryPath(LYFZ.WinAPI.CustomPublicMethod.BasePath), uploadTask.UploadOrder, uploadTask.UploadImageType), strJson);
					
					return true;
				}
				catch
				{

				}
			}

			return false;
		}

		public static void CallbackFunc(IAsyncResult result)
		{
			SaveTaskToFile handler = (SaveTaskToFile)((AsyncResult)result).AsyncDelegate;
			handler.EndInvoke(result);
        }
		#endregion

		#region 客户端
		public static readonly LYFZ.Network.TCPNetworkClient.TCP_NetworkClient tcpClient = new Network.TCPNetworkClient.TCP_NetworkClient();

		public static bool PlatinumConnect( )
		{
			string hostAddress;
			LYFZ.BLL.BLL_Config cBll = new BLL.BLL_Config();
			LYFZ.Model.Model_Config mConfig = cBll.GetModel_SysConfig();
			if (mConfig.IsOpenLocalImportPhoto && !LYFZ.WinAPI.CustomPublicMethod.CheckInternaNetworkAddress(mConfig.ServerHostOrIP))
				hostAddress = "127.0.0.1";
			else
				hostAddress = mConfig.ServerHostOrIP;

			if ( !tcpClient.ConnectionServer(hostAddress, (ushort)mConfig.OssServerPort) )
			{
				return false;
			}

			return true;
		}

		public static bool GetOssBranchList(TcpPackClient client, out List<OssBranch> listbranch, ref bool useOss)
		{
			listbranch = null;
			RequestData requestData = new RequestData((int)TCPNetworkServer.SerializerRequestCommand.OSS_QueryBranch);
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(client, requestData);
			if (returnData.ReturnStatus)
			{
				useOss = Convert.ToBoolean(returnData.AttachedMessage);
				if (returnData.DataByte != null)
				{
					listbranch = returnData.DataByteToModelObject<List<OssBranch>>();
				}
			}

			return returnData.ReturnStatus;
		}

        /// <summary>
        /// 获取云传片开启状态;
        /// </summary>
        /// <param name="client"></param>
        /// <param name="useOss"></param>
        /// <returns></returns>
        public static bool GetOssStatus(TcpPackClient client, ref bool useOss)
        {
            RequestData requestData = new RequestData((int)TCPNetworkServer.SerializerRequestCommand.OSS_Status);
            ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(client, requestData);
            if (returnData.ReturnStatus)
            {
                useOss = Convert.ToBoolean(returnData.AttachedMessage);
            }

            return returnData.ReturnStatus;
        }

		public static bool GetOssBranchList(out List<AliyunOssLibrary.Model.SimplifyBranch> listbranch, ref bool useOss)
		{
			listbranch = null;
			if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
			{
				if ( !PlatinumConnect() )
					return false;
			}

			RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_GET_BRANCH);
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);
			if (returnData.ReturnStatus)
			{
				useOss = Convert.ToBoolean(returnData.AttachedMessage);
				if (returnData.DataByte != null)
				{
					listbranch = returnData.DataByteToModelObject<List<AliyunOssLibrary.Model.SimplifyBranch>>();
				}
			}

			return returnData.ReturnStatus;
		}

		public static bool SendOssUploadInfo(TcpPackClient client, OssUploadTask uploadTask)
		{
			string strJson = JsonConvert.SerializeObject(uploadTask);

			HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
			reqParameters.SetRequestParameter<OssUploadTask>("uploadtask", uploadTask);

			RequestData requestData = new RequestData((int)TCPNetworkServer.SerializerRequestCommand.OSS_UploadTask);
			requestData.AttachedData = reqParameters.ToBytes();
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(client, requestData);
			return returnData.ReturnStatus;
		}

		public static bool SendOssUploadInfo(AliyunOssLibrary.Model.UploadTask uploadTask)
		{
			if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
			{
				if (!PlatinumConnect())
					return false;
			}

			string strJson = JsonConvert.SerializeObject(uploadTask);
			HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
			reqParameters.SetRequestParameter<AliyunOssLibrary.Model.UploadTask>("new_task", uploadTask);

			RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_NEW_TASK);
			requestData.AttachedData = reqParameters.ToBytes();
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);
			return returnData.ReturnStatus;
		}

        public static bool GetUploadOrDownload(out List<AliyunOssLibrary.Model.SafeUploadOrderDetail> listResult, AliyunOssLibrary.Enumerate.OrderListType type)
        {
            listResult = null;
            if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
            {
                if (!PlatinumConnect())
                    return false;
            }
            if (tcpClient != null)
            {
                HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
                reqParameters.SetRequestParameter<AliyunOssLibrary.Enumerate.OrderListType>("get_upload_or_download", type);

                RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_GET_UPLOAD_OR_DOWNLOAD);
                requestData.AttachedData = reqParameters.ToBytes();
                if (tcpClient.Client != null)
                {
                    ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);
                    if (returnData.ReturnStatus)
                    {
                        listResult = returnData.DataByteToModelObject<List<AliyunOssLibrary.Model.SafeUploadOrderDetail>>();
                    }

                    return returnData.ReturnStatus;
                }
                else
                {
                    LYFZ.BLL.BLL_FileLogs.WriteMainLogs("tcpClient.Client = nulll");

                    return false;
                }
            }
            else
            {
                LYFZ.BLL.BLL_FileLogs.WriteMainLogs("tcpClient = nulll");
                return false;
            }
        }

		public static bool SetUploadOpt(string upload_id, AliyunOssLibrary.Enumerate.UploadStatus status)
		{
			if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
			{
				if (!PlatinumConnect())
					return false;
			}

			HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
			reqParameters.SetRequestParameter<AliyunOssLibrary.Enumerate.UploadStatus>("set_upload_opt", status);

			RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_SET_UPLOAD);
			requestData.AttachedData = reqParameters.ToBytes();
			requestData.AttachedMessage = upload_id;
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);

			return returnData.ReturnStatus;
		}

		public static bool SetDownloadOpt(string upload_id, AliyunOssLibrary.Enumerate.DownloadStatus status)
		{
			if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
			{
				if (!PlatinumConnect())
					return false;
			}

			HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
			reqParameters.SetRequestParameter<AliyunOssLibrary.Enumerate.DownloadStatus>("set_download_opt", status);

			RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_SET_DOWNLOAD);
			requestData.AttachedData = reqParameters.ToBytes();
			requestData.AttachedMessage = upload_id;
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);

			return returnData.ReturnStatus;
		}

		public static bool SetPriority(string upload_id, bool isUpload)
		{
			if (tcpClient.AppState == HPSocketCS.Extended.AppState.Stoped)
			{
				if (!PlatinumConnect())
					return false;
			}

			HPSocketCS.Extended.RequestParameters reqParameters = new HPSocketCS.Extended.RequestParameters();
			reqParameters.SetRequestParameter<bool>("set_priority", isUpload);

			RequestData requestData = new RequestData((int)AliyunOssLibrary.Enumerate.CommProtocol.C2C_PLATINUM_SET_PRIORITY);
			requestData.AttachedData = reqParameters.ToBytes();
			requestData.AttachedMessage = upload_id;
			ReturnData returnData = SerializerDataProcessed.HP_SendSerializerCommandToServer(tcpClient.Client, requestData);

			return returnData.ReturnStatus;
		}
		#endregion
	}
}