using System.Windows;
using System.Windows.Media;
using HandyControl.Data;

namespace HandyControl.Controls;

public class TitleElement
{
    public static readonly DependencyProperty TitleProperty = DependencyProperty.RegisterAttached(
        "Title", typeof(string), typeof(TitleElement), new PropertyMetadata(default(string)));

    public static void SetTitle(DependencyObject element, string value)
        => element.SetValue(TitleProperty, value);

    public static string GetTitle(DependencyObject element)
        => (string) element.GetValue(TitleProperty);

    public static readonly DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached(
        "Background", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetBackground(DependencyObject element, Brush value)
        => element.SetValue(BackgroundProperty, value);

    public static Brush GetBackground(DependencyObject element)
        => (Brush) element.GetValue(BackgroundProperty);

    public static readonly DependencyProperty ForegroundProperty = DependencyProperty.RegisterAttached(
        "Foreground", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetForeground(DependencyObject element, Brush value)
        => element.SetValue(ForegroundProperty, value);

    public static Brush GetForeground(DependencyObject element)
        => (Brush) element.GetValue(ForegroundProperty);

    public static readonly DependencyProperty BorderBrushProperty = DependencyProperty.RegisterAttached(
        "BorderBrush", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetBorderBrush(DependencyObject element, Brush value)
        => element.SetValue(BorderBrushProperty, value);

    public static Brush GetBorderBrush(DependencyObject element)
        => (Brush) element.GetValue(BorderBrushProperty);

    public static readonly DependencyProperty TitlePlacementProperty = DependencyProperty.RegisterAttached(
        "TitlePlacement", typeof(TitlePlacementType), typeof(TitleElement), new FrameworkPropertyMetadata(TitlePlacementType.Top, FrameworkPropertyMetadataOptions.Inherits));

    public static void SetTitlePlacement(DependencyObject element, TitlePlacementType value)
        => element.SetValue(TitlePlacementProperty, value);

    public static TitlePlacementType GetTitlePlacement(DependencyObject element)
        => (TitlePlacementType) element.GetValue(TitlePlacementProperty);

    public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.RegisterAttached(
        "TitleWidth", typeof(GridLength), typeof(TitleElement), new FrameworkPropertyMetadata(GridLength.Auto, FrameworkPropertyMetadataOptions.Inherits));

    public static void SetTitleWidth(DependencyObject element, GridLength value) => element.SetValue(TitleWidthProperty, value);

    public static GridLength GetTitleWidth(DependencyObject element) => (GridLength) element.GetValue(TitleWidthProperty);

    public static readonly DependencyProperty HorizontalAlignmentProperty = DependencyProperty.RegisterAttached(
        "HorizontalAlignment", typeof(HorizontalAlignment), typeof(TitleElement), new FrameworkPropertyMetadata(default(HorizontalAlignment), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetHorizontalAlignment(DependencyObject element, HorizontalAlignment value)
        => element.SetValue(HorizontalAlignmentProperty, value);

    public static HorizontalAlignment GetHorizontalAlignment(DependencyObject element)
        => (HorizontalAlignment) element.GetValue(HorizontalAlignmentProperty);

    public static readonly DependencyProperty VerticalAlignmentProperty = DependencyProperty.RegisterAttached(
        "VerticalAlignment", typeof(VerticalAlignment), typeof(TitleElement), new FrameworkPropertyMetadata(default(VerticalAlignment), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetVerticalAlignment(DependencyObject element, VerticalAlignment value)
        => element.SetValue(VerticalAlignmentProperty, value);

    public static VerticalAlignment GetVerticalAlignment(DependencyObject element)
        => (VerticalAlignment) element.GetValue(VerticalAlignmentProperty);

    public static readonly DependencyProperty MarginOnTheLeftProperty = DependencyProperty.RegisterAttached(
        "MarginOnTheLeft", typeof(Thickness), typeof(TitleElement), new FrameworkPropertyMetadata(default(Thickness), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetMarginOnTheLeft(DependencyObject element, Thickness value)
        => element.SetValue(MarginOnTheLeftProperty, value);

    public static Thickness GetMarginOnTheLeft(DependencyObject element)
        => (Thickness) element.GetValue(MarginOnTheLeftProperty);

    public static readonly DependencyProperty MarginOnTheTopProperty = DependencyProperty.RegisterAttached(
        "MarginOnTheTop", typeof(Thickness), typeof(TitleElement), new FrameworkPropertyMetadata(default(Thickness), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetMarginOnTheTop(DependencyObject element, Thickness value)
        => element.SetValue(MarginOnTheTopProperty, value);

    public static Thickness GetMarginOnTheTop(DependencyObject element)
        => (Thickness) element.GetValue(MarginOnTheTopProperty);

    public static readonly DependencyProperty PaddingProperty = DependencyProperty.RegisterAttached(
        "Padding", typeof(Thickness), typeof(TitleElement), new FrameworkPropertyMetadata(default(Thickness), FrameworkPropertyMetadataOptions.Inherits));

    public static void SetPadding(DependencyObject element, Thickness value) => element.SetValue(PaddingProperty, value);

    public static Thickness GetPadding(DependencyObject element) => (Thickness) element.GetValue(PaddingProperty);

    public static readonly DependencyProperty MinHeightProperty =
        DependencyProperty.RegisterAttached("MinHeight", typeof(double), typeof(TitleElement), new PropertyMetadata(ValueBoxes.Double0Box));

    public static double GetMinHeight(DependencyObject obj) => (double) obj.GetValue(MinHeightProperty);

    public static void SetMinHeight(DependencyObject obj, double value) => obj.SetValue(MinHeightProperty, value);

    public static readonly DependencyProperty MinWidthProperty =
        DependencyProperty.RegisterAttached("MinWidth", typeof(double), typeof(TitleElement), new PropertyMetadata(ValueBoxes.Double0Box));

    public static double GetMinWidth(DependencyObject obj) => (double) obj.GetValue(MinWidthProperty);

    public static void SetMinWidth(DependencyObject obj, double value) => obj.SetValue(MinWidthProperty, value);
}
