using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using log4net;
using SparkClient.ViewModel.Grading;
using GeometryModel3D = HelixToolkit.Wpf.SharpDX.GeometryModel3D;

namespace SparkClient.Views.Grading;

public partial class GradingResult 
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(GradingResult));

    // List<Viewport3DTriangleEntity> triangles = new List<Viewport3DTriangleEntity>();
    List<GeometryModel3D> mouseAddModels = new List<GeometryModel3D>();
    // 用于记录当前所有已存在的Popup
    private List<Popup> _allPopups = new List<Popup>();
    public GradingResult()
    {
        InitializeComponent();
        
        // 在Window最外层捕获鼠标点击,判断是否点击在Popup之外,如果是则关闭所有Popup
        this.PreviewMouseLeftButtonDown += Window_PreviewMouseLeftButtonDown;
        //DataContext = new GradingResultVM(null);
        
        // this.Viewport3Dx.EffectsManager = new DefaultEffectsManager();
        // this.Viewport3Dx.Camera = new PerspectiveCamera()
        // {
        //     Position = new Point3D(0, 0, 5),
        //     LookDirection = new Vector3D(0, 0, -1),
        //     UpDirection = new Vector3D(0, 1, 0),
        //     FarPlaneDistance = 1000,
        //     NearPlaneDistance = 0.1
        // };

        // Loaded += (sender, args) =>
        // {
        //     var entities = Viewport3DHelper.InitDemo(Viewport3Dx);
        //     triangles.AddRange(entities);
        // };
    }
    

    /// <summary>
    /// 点击模型
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Viewport3Dx_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // // 获取鼠标点击位置
        // var mousePosition = e.GetPosition(Viewport3Dx);
        //
        // // 查找鼠标点击的 3D 对象
        // var hits = Viewport3Dx.FindHits(mousePosition);
        //
        // // 如果没有命中任何 3D 对象
        // if (hits == null || hits.Count == 0)
        // {
        //     Console.WriteLine("未点击到任何模型");
        //     foreach (var item in mouseAddModels)
        //     {
        //         Viewport3Dx.Items.Remove(item);
        //     }
        //     mouseAddModels.Clear();
        //     return;
        // }
        //
        // // 获取第一个命中的对象
        // var hit = hits[0];
        //
        // // 检查是否是 MeshGeometryModel3D
        // if (hit.ModelHit is MeshGeometryModel3D modelHit)
        // {
        //     foreach (var item in mouseAddModels)
        //     {
        //         Viewport3Dx.Items.Remove(item);
        //     }
        //     mouseAddModels.Clear();
        //     // 获取几何信息
        //     var geometry = modelHit.Geometry as MeshGeometry3D;
        //     if (geometry != null)
        //     {
        //         // 获取命中的三角形索引
        //         var triangleIndex = hit.TriangleIndices;
        //
        //         // 获取三角形顶点
        //         var vertex1 = geometry.Positions[triangleIndex.Item1];
        //         var vertex2 = geometry.Positions[triangleIndex.Item2];
        //         var vertex3 = geometry.Positions[triangleIndex.Item3];
        //
        //         string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z;
        //         string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint);
        //         
        //         //命中实体
        //         Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode));
        //
        //         if (res == null)
        //             return;
        //
        //         //命中面
        //         List<Viewport3DTriangleEntity> facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList();
        //         var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f);
        //         var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet);
        //         mouseAddModels.AddRange(data1);
        //         //命中面标线
        //         var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet);
        //         mouseAddModels.AddRange(data2);
        //         //命中同类面
        //         List<Viewport3DTriangleEntity> facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList();
        //         //排除自己
        //         facet.ForEach(e=>facetType.Remove(e));
        //         var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f);
        //         var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType);
        //         mouseAddModels.AddRange(data3);
        //     }
        // }
        // else
        // {
        //     Console.WriteLine("点击的对象不是 MeshGeometryModel3D");
        // }
    }

    private void ChangSymLevel(object sender, SelectionChangedEventArgs e)
    {
        var d = DataContext as GradingResultVM;
        d.ChangeSym(null);
    }

    // private void dataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    // {
    //     detailPopup.IsOpen = false;
    //     // 获取点击的目标元素
    //     var element = sender as FrameworkElement;
    //
    //     var cell = FindVisualParent<DataGridCell>(element);
    //     if (cell == null) return;
    //
    //     var row = FindVisualParent<DataGridRow>(cell);
    //     if (row == null) return;
    //
    //     if (element != null)
    //     {
    //         // 将 firstCell 的边界转换为屏幕坐标系
    //         var firstCellBounds = cell.PointToScreen(new Point(0, 0));
    //
    //         // 计算Popup的位置
    //         var popupPosition = new Point(firstCellBounds.X + cell.RenderSize.Width, firstCellBounds.Y + cell.RenderSize.Height);
    //         var selectObject = row.Item as DataInfo;
    //         string testItemId = selectObject.TestItemId;
    //         var d = DataContext as GradingResultVM;
    //         RowDetail rowDetail = d.getSelectData(testItemId);
    //         // 设置Popup的位置
    //         detailPopup.HorizontalOffset = popupPosition.X;
    //         detailPopup.VerticalOffset = popupPosition.Y;
    //         detailPopup.IsOpen = true;
    //         RowDetail.Items.Clear();
    //         RowDetail.Items.Add(rowDetail);
    //     }
    // }
    // 辅助方法:查找父元素
    private T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
    {
        var parentObject = VisualTreeHelper.GetParent(child);
        if (parentObject == null) return null;

        if (parentObject is T parent)
        {
            return parent;
        }
        else
        {
            return FindVisualParent<T>(parentObject);
        }
    }
    // private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    // {
    //     detailPopup.IsOpen = false;
    // }
    //
    // private void Window_MouseDown(object sender, RoutedEventArgs e)
    // {
    //     detailPopup.IsOpen = false;
    // }


    private void ClickArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var border = sender as Border;
        if (border == null) return;

        var parentGrid = border.Parent as Grid;
        if (parentGrid == null) return;

        var popup = parentGrid.FindName("RowPopup") as Popup;
        if (popup == null) return;
        popup.DataContext = this.DataContext;
        // 先关闭所有已显示的 Popup
        CloseAllPopups();

        var oo = FindVisualParent<DataGridRow>(parentGrid);
        if(oo == null) return;
        var d = DataContext as GradingResultVM;
        RowDetail rowDetail = d.getSelectData((oo.Item as DataInfo).TestItemId);
      
        if (!_allPopups.Contains(popup))
        {
            _allPopups.Add(popup);
        }

        // 显示新Popup
        popup.IsOpen = true;
        popup.Visibility = Visibility.Visible; 
    }
    
    private void CloseAllPopups()
    {
        foreach (var p in _allPopups)
        {
            p.IsOpen = false;
            p.Visibility = Visibility.Collapsed;
        }
    }
    
    private void CloseAllPopup_Click(object sender, RoutedEventArgs e)
    {
        CloseAllPopups();
    }
    
    private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // originalSource 是点击处的控件
        var clickedElement = e.OriginalSource as DependencyObject;

        // 遍历所有已知 Popup
        bool isClickOnAnyPopup = false;
        foreach (var p in _allPopups)
        {
            // 如果此 Popup 不可见或未打开,就不用检查了
            if (!p.IsOpen) 
                continue;

            // 判断点击处是否在此 Popup 内
            if (IsDescendantOf(p.Child, clickedElement))
            {
                // 找到一个 Popup 包含这个点击
                isClickOnAnyPopup = true;
                break;
            }
        }

        // 如果没点击到任何 Popup,就关闭全部
        if (!isClickOnAnyPopup)
        {
            CloseAllPopups();
        }
    }
    private bool IsDescendantOf(DependencyObject parent, DependencyObject clicked)
    {
        if (parent == null || clicked == null)
            return false;

        // 从 clicked 开始不断向上找 VisualTree
        var current = clicked;
        while (current != null)
        {
            if (current == parent)
            {
                return true;
            }
            current = VisualTreeHelper.GetParent(current);
        }
        return false;
    }


    private void UIElement_OnMouseLeave(object sender, MouseEventArgs e)
    {
        if (sender is Image image)
        {
            image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8.png"));
        }
    }

    private void UIElement_OnMouseEnter(object sender, MouseEventArgs e)
    {
        if (sender is Image image)
        {
            image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8-1.png"));
        }
    }
}