using System;
using Autodesk.Navisworks.Api;
using Autodesk.Navisworks.Api.Plugins;

namespace NavisworksTransport
{
    /// <summary>
    /// 自定义工具插件，用于获取精确的鼠标点击坐标
    /// </summary>
    [Plugin("PathClickTool", "NavisworksTransport")]
    public class PathClickToolPlugin : ToolPlugin
    {
        /// <summary>
        /// 插件构造函数
        /// </summary>
        public PathClickToolPlugin()
        {
            LogManager.Debug("[ToolPlugin] PathClickToolPlugin实例已创建");
        }
        /// <summary>
        /// 点击事件，传递精确的点击坐标和对象
        /// </summary>
        public static event EventHandler<PickItemResult> MouseClicked;

        /// <summary>
        /// 获取插件的程序集路径（用于动态加载）
        /// </summary>
        public static string AssemblyPath
        {
            get
            {
                return System.Reflection.Assembly.GetExecutingAssembly().Location;
            }
        }

        /// <summary>
        /// 公开方法，允许外部代码触发 MouseClicked 事件
        /// 用于 PathInputMonitor 等备用输入机制
        /// </summary>
        /// <param name="sender">事件发送者</param>
        /// <param name="result">点击结果</param>
        public static void TriggerMouseClicked(object sender, PickItemResult result)
        {
            MouseClicked?.Invoke(sender, result);
        }

        /// <summary>
        /// 公开方法，允许外部代码手动触发ESC取消
        /// </summary>
        public static void TriggerEscCancel()
        {
            // 在 PathPlanningManager 中通过键盘钩子或其他方式调用
        }

        /// <summary>
        /// 重写鼠标按下事件，获取精确的点击坐标
        /// </summary>
        public override bool MouseDown(View view, KeyModifiers modifiers, ushort button, int x, int y, double timeOffset)
        {
            LogManager.Debug("[ToolPlugin] ★★★ MouseDown方法被调用 ★★★");
            try
            {
                LogManager.Debug("[ToolPlugin] ===== 鼠标点击事件 =====");
                LogManager.Debug($"[ToolPlugin] 屏幕坐标: ({x}, {y})");
                LogManager.Debug($"[ToolPlugin] 按键: {button}, 修饰键: {modifiers}");

                // 只处理左键点击
                if (button == 1) // 左键
                {
                    LogManager.Debug("[ToolPlugin] 检测到左键点击，开始处理");

                    // 使用PickItemFromPoint获取精确的3D坐标
                    PickItemResult itemResult = view.PickItemFromPoint(x, y);
                    
                    if (itemResult != null)
                    {
                        LogManager.Debug("[ToolPlugin] ✓ PickItemFromPoint成功");
                        LogManager.Debug($"[ToolPlugin] 精确3D坐标: ({itemResult.Point.X:F3}, {itemResult.Point.Y:F3}, {itemResult.Point.Z:F3})");
                        LogManager.Debug($"[ToolPlugin] 选中对象: {itemResult.ModelItem?.DisplayName ?? "NULL"}");

                        // 触发事件，将精确坐标传递给PathPlanningManager
                        MouseClicked?.Invoke(this, itemResult);

                        LogManager.Debug("[ToolPlugin] 事件已触发");
                    }
                    else
                    {
                        LogManager.Debug("[ToolPlugin] ✗ PickItemFromPoint返回null（未点击到对象）");
                    }
                }
                else
                {
                    LogManager.Debug($"[ToolPlugin] 忽略非左键点击: {button}");
                }

                // 返回false表示继续传递事件给其他处理程序
                return false;
            }
            catch (Exception ex)
            {
                LogManager.Error($"[ToolPlugin] 异常: {ex.Message}");
                LogManager.Error($"[ToolPlugin] 堆栈: {ex.StackTrace}");
                return false;
            }
        }

        /// <summary>
        /// 鼠标移动事件（可用于悬停显示坐标）
        /// </summary>
        public override bool MouseMove(View view, KeyModifiers modifiers, int x, int y, double timeOffset)
        {
            // 暂时不处理鼠标移动事件，避免日志过多
            return false;
        }

        /// <summary>
        /// 重写光标样式，使用捕捉光标提供更好的视觉反馈
        /// </summary>
        /// <param name="view">当前视图</param>
        /// <param name="modifier">键盘修饰键</param>
        /// <returns>返回捕捉光标</returns>
        public override Cursor GetCursor(View view, KeyModifiers modifier)
        {
            // 使用测量光标（十字线），提供更好的视觉反馈用于精确路径点选择
            return Cursor.Measure;
        }
    }
} 