using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using NotImplementedException = System.NotImplementedException;

namespace Plugins.JNGame.Sync.Frame.AStar.Entity
{
    
    /// <summary>  
    /// 为图形暴露内部方法。  
    /// </summary>  
    public interface IGraphInternals {  
        // // 获取或设置序列化后的编辑器设置。  
        // string SerializedEditorSettings { get; set; }  
        //
        // // 当对象被销毁时调用此方法。  
        // void OnDestroy();  
        
        // 销毁所有节点。  
        void DestroyAllNodes();  
        //
        // 扫描图形并返回进度的集合。  
        void ScanInternal();  
        //
        // // 序列化额外的信息到图形序列化上下文中。  
        // void SerializeExtraInfo(GraphSerializationContext ctx);  
        //
        // // 从图形序列化上下文中反序列化额外的信息。  
        // void DeserializeExtraInfo(GraphSerializationContext ctx);  
        //
        // // 在反序列化后执行一些后处理操作。  
        // void PostDeserialization(GraphSerializationContext ctx);  
        //
        // // 为了兼容性，从图形序列化上下文中反序列化设置。  
        // void DeserializeSettingsCompatibility(GraphSerializationContext ctx);  
    }

    public abstract class NavGraph : IGraphInternals {
        
        /// <summary>图形的索引，用于识别目的</summary>  
        public uint graphIndex;

        protected AStarData data;

        protected NavGraph(AStarData data)
        {
            this.data = data;
        }

        //渲染GUI
        public abstract void DrawGUI();
        
        /// <summary>  
        /// 使用图形中的所有节点调用一个委托。  
        /// 这是遍历图形中所有节点的主要方式。  
        ///  
        /// 不要在委托内部改变图形的结构。  
        ///     // 这里是一个节点  
        ///     Debug.Log("I found a node at position " + (Vector3)node.position);  
        /// });active.data.gridGraph;  
        ///  
        /// List<GraphNode> nodes = new List<GraphNode>();  
        ///  
        /// gg.GetNodes((System.Action<GraphNode>)nodes.Add);  
        /// </code>  
        ///  
        /// 参见：<see cref="Pathfinding.AstarData.GetNodes"/>  
        /// </summary>  
        public abstract void GetNodes(Action<GraphNode> action);
        
        /// <summary>  
        /// 销毁图形中的所有节点。  
        /// 警告：这是一个内部方法。除非你有非常充分的理由，否则你最好不要调用它。  
        /// </summary>  
        public virtual void DestroyAllNodes () {  
            // 调用 GetNodes 方法，对每个节点执行 Destroy 操作  
            GetNodes(node => node.Destroy());  
        }

        public abstract void ScanInternal();
    }

}