using Avalonia;
using Avalonia.Controls;
using Avalonia.LogicalTree;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InABox.Avalonia;

public static class AvaloniaUtils
{

    #region Grid Children

    public static int GetRow(this Grid grid, ILogical dependencyObject)
    {
        while (true)
        {
            var parent = dependencyObject.GetLogicalParent();
            if (parent == null)
                return -1;
            if (parent == grid)
                return dependencyObject is Control control ? Grid.GetRow(control) : -1;
            dependencyObject = parent;
        }
    }

    public static int GetRowSpan(this Grid grid, ILogical dependencyObject)
    {
        while (true)
        {
            var parent = dependencyObject.GetLogicalParent();
            if (parent == null)
                return -1;
            if (parent == grid)
                return dependencyObject is Control control ? Grid.GetRowSpan(control) : -1;
            dependencyObject = parent;
        }
    }
   
    public static int GetColumn(this Grid grid, ILogical dependencyObject)
    {
        while (true)
        {
            var parent = dependencyObject.GetLogicalParent();
            if (parent == null)
                return -1;
            if (parent == grid)
                return dependencyObject is Control control ? Grid.GetColumn(control) : -1;
            dependencyObject = parent;
        }
    }

    public static int GetColumnSpan(this Grid grid, ILogical dependencyObject)
    {
        while (true)
        {
            var parent = dependencyObject.GetLogicalParent();
            if (parent == null)
                return -1;
            if (parent == grid)
                return dependencyObject is Control control ? Grid.GetColumnSpan(control) : -1;
            dependencyObject = parent;
        }
    }
   
    public static void SetGridPosition(this AvaloniaObject element, int row, int column, int rowspan = 1, int colspan = 1)
    {
        element.SetValue(Grid.ColumnProperty, column);
        element.SetValue(Grid.ColumnSpanProperty, Math.Max(1, colspan));
        element.SetValue(Grid.RowProperty, row);
        element.SetValue(Grid.RowSpanProperty, Math.Max(1, rowspan));
    }
    public static Grid AddChild(this Grid grid, Control element, int row, int column, int rowSpan = 1, int colSpan = 1)
    {
        element.SetGridPosition(row, column, rowSpan, colSpan);
        grid.Children.Add(element);
        return grid;
    }

    #endregion

    #region Grid Columns + Rows

    public static ColumnDefinition AddColumn(this Grid grid, GridUnitType type, double value = 1)
    {
        var colDef = new ColumnDefinition { Width = new GridLength(value, type) };
        grid.ColumnDefinitions.Add(colDef);
        return colDef;
    }
    public static ColumnDefinition AddColumn(this Grid grid, double value)
    {
        var colDef = new ColumnDefinition { Width = new GridLength(value) };
        grid.ColumnDefinitions.Add(colDef);
        return colDef;
    }

    public static RowDefinition AddRow(this Grid grid, GridUnitType type, double value = 1)
    {
        var rowDef = new RowDefinition { Height = new GridLength(value, type) };
        grid.RowDefinitions.Add(rowDef);
        return rowDef;
    }
    public static RowDefinition AddRow(this Grid grid, double value)
    {
        var rowDef = new RowDefinition { Height = new GridLength(value) };
        grid.RowDefinitions.Add(rowDef);
        return rowDef;
    }

    #endregion

}
