#if UNITY_2019_4_OR_NEWER
using System.IO;
using System.Linq;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEditor.UIElements;
using UnityEngine.UIElements;
namespace YooAsset.Editor
{
	internal class DebuggerAssetListViewer
	{
		private VisualTreeAsset _visualAsset;
		private TemplateContainer _root;
		private ListView _assetListView;
		private ListView _dependListView;
		private DebugReport _debugReport;
		/// 
		/// 初始化页面
		/// 
		public void InitViewer()
		{
			// 加载布局文件		
			_visualAsset = UxmlLoader.LoadWindowUXML();
			if (_visualAsset == null)
				return;
			_root = _visualAsset.CloneTree();
			_root.style.flexGrow = 1f;
			// 资源列表
			_assetListView = _root.Q("TopListView");
			_assetListView.makeItem = MakeAssetListViewItem;
			_assetListView.bindItem = BindAssetListViewItem;
#if UNITY_2020_1_OR_NEWER
			_assetListView.onSelectionChange += AssetListView_onSelectionChange;
#else
			_assetListView.onSelectionChanged += AssetListView_onSelectionChange;
#endif
			// 依赖列表
			_dependListView = _root.Q("BottomListView");
			_dependListView.makeItem = MakeDependListViewItem;
			_dependListView.bindItem = BindDependListViewItem;
#if UNITY_2020_3_OR_NEWER
			SplitView.Adjuster(_root);
#endif
		}
		/// 
		/// 清空页面
		/// 
		public void ClearView()
		{
			_debugReport = null;
			_assetListView.Clear();
			_assetListView.ClearSelection();
			_assetListView.itemsSource.Clear();
			_assetListView.Rebuild();
		}
		/// 
		/// 填充页面数据
		/// 
		public void FillViewData(DebugReport debugReport, string searchKeyWord)
		{
			_debugReport = debugReport;
			_assetListView.Clear();
			_assetListView.ClearSelection();
			_assetListView.itemsSource = FilterViewItems(debugReport, searchKeyWord);
			_assetListView.Rebuild();
		}
		private List FilterViewItems(DebugReport debugReport, string searchKeyWord)
		{
			List result = new List(1000);
			foreach (var packageData in debugReport.PackageDatas)
			{
				var tempList = new List(packageData.ProviderInfos.Count);
				foreach (var providerInfo in packageData.ProviderInfos)
				{
					if (string.IsNullOrEmpty(searchKeyWord) == false)
					{
						if (providerInfo.AssetPath.Contains(searchKeyWord) == false)
							continue;
					}
					providerInfo.PackageName = packageData.PackageName;
					tempList.Add(providerInfo);
				}
				tempList.Sort();
				result.AddRange(tempList);
			}
			return result;
		}
		/// 
		/// 挂接到父类页面上
		/// 
		public void AttachParent(VisualElement parent)
		{
			parent.Add(_root);
		}
		/// 
		/// 从父类页面脱离开
		/// 
		public void DetachParent()
		{
			_root.RemoveFromHierarchy();
		}
		// 顶部列表相关
		private VisualElement MakeAssetListViewItem()
		{
			VisualElement element = new VisualElement();
			element.style.flexDirection = FlexDirection.Row;
			{
				var label = new Label();
				label.name = "Label0";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 150;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label1";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				label.style.flexGrow = 1f;
				label.style.width = 280;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label2";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 150;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label3";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 150;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label4";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 150;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label5";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 100;
				element.Add(label);
			}
			{
				var label = new Label();
				label.name = "Label6";
				label.style.unityTextAlign = TextAnchor.MiddleLeft;
				label.style.marginLeft = 3f;
				//label.style.flexGrow = 1f;
				label.style.width = 120;
				element.Add(label);
			}
			return element;
		}
		private void BindAssetListViewItem(VisualElement element, int index)
		{
			var sourceData = _assetListView.itemsSource as List;
			var providerInfo = sourceData[index];
			// Package Name
			var label0 = element.Q