using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
namespace YooAsset
{
	/// 
	/// 下载器
	/// 说明:UnityWebRequest(UWR) supports reading streaming assets since 2017.1
	/// 
	internal class UnityWebDataRequester
	{
		private UnityWebRequest _webRequest;
		private UnityWebRequestAsyncOperation _operationHandle;
		/// 
		/// 请求URL地址
		/// 
		public string URL { private set; get; }
		/// 
		/// 发送GET请求
		/// 
		/// 超时:从请求开始计时
		public void SendRequest(string url, int timeout = 0)
		{
			if (_webRequest == null)
			{
				URL = url;
				_webRequest = DownloadSystem.NewRequest(URL);
				DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
				_webRequest.downloadHandler = handler;
				_webRequest.disposeDownloadHandlerOnDispose = true;
				_webRequest.timeout = timeout;
				_operationHandle = _webRequest.SendWebRequest();
			}
		}
		/// 
		/// 获取下载的字节数据
		/// 
		public byte[] GetData()
		{
			if (_webRequest != null && IsDone())
				return _webRequest.downloadHandler.data;
			else
				return null;
		}
		/// 
		/// 获取下载的文本数据
		/// 
		public string GetText()
		{
			if (_webRequest != null && IsDone())
				return _webRequest.downloadHandler.text;
			else
				return null;
		}
		/// 
		/// 释放下载器
		/// 
		public void Dispose()
		{
			if (_webRequest != null)
			{
				_webRequest.Dispose();
				_webRequest = null;
				_operationHandle = null;
			}
		}
		/// 
		/// 是否完毕(无论成功失败)
		/// 
		public bool IsDone()
		{
			if (_operationHandle == null)
				return false;
			return _operationHandle.isDone;
		}
		/// 
		/// 下载进度
		/// 
		public float Progress()
		{
			if (_operationHandle == null)
				return 0;
			return _operationHandle.progress;
		}
		/// 
		/// 下载是否发生错误
		/// 
		public bool HasError()
		{
#if UNITY_2020_3_OR_NEWER
			return _webRequest.result != UnityWebRequest.Result.Success;
#else
			if (_webRequest.isNetworkError || _webRequest.isHttpError)
				return true;
			else
				return false;
#endif
		}
		/// 
		/// 获取错误信息
		/// 
		public string GetError()
		{
			if (_webRequest != null)
			{
				return $"URL : {URL} Error : {_webRequest.error}";
			}
			return string.Empty;
		}
	}
}