using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Harmonia.WinUI.Flex;

public interface IFlexView
{
    FlexLayout Layout { get; }
    int ImageWidth { get; }
    FlexOrientation ListOrientation { get; }
    int RowSpacing { get; }
    int ColumnSpacing { get; }
    int TextLineHeight { get; }
    FlexOrientation SubtitleFooterOrientation { get; }
    int SubtitleFooterMargin { get; }
    FlexOrientation ImageToTextOrientation { get; }
    int TitleFontSize { get; }
    int SubtitleFontSize { get; }
    int FooterFontSize { get; }
}

public abstract class GridFlexViewBase : IFlexView
{
    public FlexLayout Layout => FlexLayout.Grid;
    public FlexOrientation ListOrientation => FlexOrientation.Horizontal;
    public FlexOrientation SubtitleFooterOrientation => FlexOrientation.Vertical;
    public FlexOrientation ImageToTextOrientation => FlexOrientation.Vertical;

    public abstract int ImageWidth { get; }
    public abstract int RowSpacing { get; }
    public abstract int ColumnSpacing { get; }
    public abstract int TextLineHeight { get; }
    public abstract int SubtitleFooterMargin { get; }
    public abstract int TitleFontSize { get; }
    public abstract int SubtitleFontSize { get; }
    public abstract int FooterFontSize { get; }
}

public abstract class ListFlexViewBase : IFlexView
{
    public FlexLayout Layout => FlexLayout.List;
    public FlexOrientation ListOrientation => FlexOrientation.Vertical;
    public FlexOrientation SubtitleFooterOrientation => FlexOrientation.Vertical;
    public FlexOrientation ImageToTextOrientation => FlexOrientation.Vertical;

    public abstract int ImageWidth { get; }

    public abstract int RowSpacing { get; }

    public abstract int ColumnSpacing { get; }

    public abstract int TextLineHeight { get; }

    public abstract int SubtitleFooterMargin { get; }

    public abstract int TitleFontSize { get; }

    public abstract int SubtitleFontSize { get; }

    public abstract int FooterFontSize { get; }
}

public enum FlexLayout
{
    List,
    Grid
}

public enum FlexOrientation
{
    Horizontal,
    Vertical
}