﻿using System.Collections.Generic;
using System.IO;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Utils;
using UnityEditor;
using UnityEditor.U2D;
using UnityEngine;

namespace JLGames.RocketDriver.Editor.Infra
{
    internal class AssetDetail
    {
        public string UnityPath;
        public FileSystemInfo SystemInfo;
        public bool IsFile;
    }

    [CustomEditor(typeof(EditorAssetIndex))]
    [CanEditMultipleObjects]
    public class EditorAssetIndexEditor : UnityEditor.Editor
    {
        SerializedProperty m_IncludeFolder;
        SerializedProperty m_IncludeExtensions;
        SerializedProperty m_SourceFolders;
        SerializedProperty m_References;

        private void OnEnable()
        {
            m_IncludeFolder = serializedObject.FindProperty("m_IncludeFolder");
            m_IncludeExtensions = serializedObject.FindProperty("m_IncludeExtensions");
            m_SourceFolders = serializedObject.FindProperty("m_SourceFolders");
            m_References = serializedObject.FindProperty("m_References");
        }

        public override void OnInspectorGUI()
        {
            EditorGUILayout.PropertyField(m_IncludeFolder);
            EditorGUILayout.PropertyField(m_IncludeExtensions);
            EditorGUILayout.PropertyField(m_SourceFolders);
            AddUpdateButton();
            GUI.enabled = false;
            EditorGUILayout.PropertyField(m_References, true);
            GUI.enabled = true;
            serializedObject.ApplyModifiedProperties();
        }

        private void AddUpdateButton()
        {
            if (GUILayout.Button("更新索引"))
            {
                UpdateIndex();
            }
        }

        private void UpdateIndex()
        {
            var temp = CreateInstance<EditorAssetIndex>();
            temp.SetIncludeFolder(m_IncludeFolder.boolValue);
            temp.SetIncludeExtensions(GetStringArray(m_IncludeExtensions));
            temp.SetSourceFolders(GetStringArray(m_SourceFolders));
            temp.UpdateAssetIndex();
            UpdateExtensions(temp);
            UpdateReferences(temp);
        }

        private void UpdateReferences(EditorAssetIndex indexData)
        {
            m_References.arraySize = 0;
            if (indexData.ContainsReference)
            {
                var refs = indexData.References;
                for (var index = 0; index < refs.Count; index++)
                {
                    m_References.InsertArrayElementAtIndex(index);
                    var ele = m_References.GetArrayElementAtIndex(index);
                    var data = refs[index];
                    ele.FindPropertyRelative("AssetName").stringValue = data.AssetName;
                    ele.FindPropertyRelative("UnityPath").stringValue = data.UnityPath;
                    ele.FindPropertyRelative("Guid").stringValue = data.Guid;
                    ele.FindPropertyRelative("FileId").longValue = data.FileId;
                    ele.FindPropertyRelative("SpriteId").stringValue = data.SpriteId;
                }
            }

            m_References.serializedObject.ApplyModifiedProperties();
        }

        private void UpdateExtensions(EditorAssetIndex indexData)
        {
            m_IncludeExtensions.arraySize = 0;
            if (indexData.ContainsExtension)
            {
                var exts = indexData.IncludeExtensions;
                for (var index = 0; index < exts.Count; index++)
                {
                    m_IncludeExtensions.InsertArrayElementAtIndex(index);
                    m_IncludeExtensions.GetArrayElementAtIndex(index).stringValue = exts[index];
                }
            }

            m_IncludeExtensions.serializedObject.ApplyModifiedProperties();
        }

        private readonly List<string> m_Temp = new List<string>();

        private string[] GetStringArray(SerializedProperty pro)
        {
            m_Temp.Clear();
            var size = pro.arraySize;

            for (var index = 0; index < size; index++)
            {
                var value = pro.GetArrayElementAtIndex(index).stringValue;
                m_Temp.Add(value);
            }

            return m_Temp.ToArray();
        }
    }
}