using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Html;

namespace WebfrontCore.ViewModels;

public class TableInfo
{
    public string Header { get; set; }
    public List<ColumnDefinition> Columns { get; } = new();
    public List<RowDefinition> Rows { get; } = new();
    public int InitialRowCount { get; }

    public TableInfo(int initialRowCount = 0)
    {
        InitialRowCount = initialRowCount;
    }
}

public class RowDefinition
{
    public List<ColumnTypeDefinition> Datum { get; } = new();
}

public class ColumnDefinition
{
    public string Title { get; set; }
    public string ColumnSpan { get; set; }
}

public enum ColumnType
{
    Text,
    Link,
    Icon,
    Button
}

public class ColumnTypeDefinition
{
    public ColumnType Type { get; set; }
    public string Value { get; set; }
    public string Data { get; set; }
    public IHtmlContent Template { get; set; }
    public int Id { get; set; }
}

public static class TableInfoExtensions
{
    public static TableInfo WithColumns(this TableInfo info, IEnumerable<string> columns)
    {
        info.Columns.AddRange(columns.Select(column => new ColumnDefinition
        {
            Title = column
        }));

        return info;
    }

    public static TableInfo WithRows<T>(this TableInfo info, IEnumerable<T> source,
        Func<T, IEnumerable<string>> selector)
    {
        return WithRows(info, source, (outer) => selector(outer).Select(item => new ColumnTypeDefinition
        {
            Value = item,
            Type = ColumnType.Text
        }));
    }

    public static TableInfo WithRows<T>(this TableInfo info, IEnumerable<T> source,
        Func<T, IEnumerable<ColumnTypeDefinition>> selector)
    {
        info.Rows.AddRange(source.Select(row =>
        {
            var rowDef = new RowDefinition();
            rowDef.Datum.AddRange(selector(row));
            return rowDef;
        }));
        return info;
    }
}