using adas_core.Domain.Enums;
using MongoDB.Bson;

namespace adas_core.Domain.Models.MongoModels;

#region HomeConfig

/// <summary>
/// Represents a configuration class for defining the properties and settings of a card.
/// </summary>
/// <remarks>
/// This class is intended to be used as a data container or settings holder for card-related configurations.
/// </remarks>
public class CardConfig
{
    public ObjectId Id { get; set; }
    public List<RowCardConfig>? Rows { get; set; }
}

/// <summary>
/// Represents configuration settings for a row card component.
/// </summary>
/// <remarks>
/// This type is intended to be used as a data container to define the visual or behavioral properties of a row card.
/// </remarks>
public class RowCardConfig
{
    // Dynamic cells de nurse y Dynamic Obs de monitoring
    public List<Cell>? Cells { get; set; }
    public double? GrowPriority { get; set; }
    public DisplayConfigEnums.CellType Type { get; set; }
    public string? Border { get; set; }
    public string? BorderRadius { get; set; }
    public string? Title { get; set; }
    public string? Size { get; set; }
    public string? MarginTop { get; set; }
    public string? MarginBottom { get; set; }
    public string? MarginLeft { get; set; }
    public string? MarginRight { get; set; }
    public string? BgColor { get; set; }
    public string? PaddingTop { get; set; }
    public string? PaddingBottom { get; set; }
    public string? PaddingLeft { get; set; }
    public string? PaddingRight { get; set; }
}

/// <summary>
/// Represents a single cell, typically used as an individual unit within a larger structured data model such as a grid, table, or matrix.
/// </summary>
public class Cell
{
    public ChartSettings? ChartSettings { get; set; }
    public List<ObservationTextRule>? TextRules { get; set; }
    public DisplayConfigEnums.CellType Type { get; set; }

    public string? SubType { get; set; }
    public double? Size { get; set; }
    public List<Cell>? SubObs { get; set; }
    public bool? HideName { get; set; }
    public bool? IsStatic { get; set; }
    public double? GrowPriority { get; set; }
    public string? Border { get; set; }
    public string? BorderRadius { get; set; }
    public string? Name { get; set; }
    public bool IsVisible { get; set; } = true;
    public bool? IsColumn { get; set; }
    public string? BgColor { get; set; }
    public string? Title { get; set; }

    public string? ValuePathNested { get; set; }
    public List<string>? ValuePathKey { get; set; }
    public List<IconValueList>? IconValueList { get; set; }
    public string? PaddingTop { get; set; }
    public string? PaddingBottom { get; set; }
    public string? PaddingLeft { get; set; }
    public string? PaddingRight { get; set; }
    public string? Color { get; set; }
    public string? BackgroundColor { get; set; }
    public bool? ShowIcon { get; set; }
    public string? FlexBasis { get; set; }
    public string? Grow { get; set; }
    public string? Shrink { get; set; }
    public bool? ShowTitle { get; set; }
    public DialogConfig? DialogConfig { get; set; }
    public bool? IndicatorHorizontal { get; set; }
    public bool? ShowIndicator { get; set; }
    public bool? OnlyNumber { get; set; }
    public bool? ShowArrow { get; set; }
    public string? GraphConf { get; set; }
    public List<string>? Names { get; set; }
    public List<string>? ObservationName { get; set; }
    public List<List<string>?>? ObservationTitle { get; set; }
    public DisplayConfigEnums.DirectionEnum? Direction { get; set; }
}

/// <summary>
/// Represents the configuration settings used to control the appearance and behavior of a chart.
/// </summary>
public class ChartSettings
{
    public LegendLayoutConfig? LegendLayoutConfig { get; set; }
    public decimal? LegendGrowPriority { get; set; }
    public decimal? ChartGrowPriority { get; set; }
}

/// <summary>
/// Represents configuration settings for a dialog, providing a centralized structure to manage dialog-related options and parameters.
/// </summary>
public class DialogConfig
{
    public bool? IsDraggable { get; set; }
    public MedicalConfig? MedicalConfig { get; set; }
}

/// <summary>
/// Represents a configuration class for medical-related settings and parameters.
/// </summary>
/// <remarks>
/// Serves as a container for medical configuration data, providing a centralized structure to manage and access medical settings within the application.
/// </remarks>
public class MedicalConfig
{
    public bool HasFinalizeTime { get; set; }
    public bool HasStartTime { get; set; }
}

/// <summary>
/// Represents a list of icon values, providing a collection structure for managing and accessing icon-related data.
/// </summary>
public class IconValueList
{
    public double? MinValue { get; set; }
    public double? MaxValue { get; set; }
    public float? Width { get; set; }
    public float? Height { get; set; }
    public List<string>? IconList { get; set; }
}

/// <summary>
/// Represents the configuration settings for the home page or home component.
/// </summary>
public class HomeConfig
{
    public string? MinColumnSize { get; set; }
    public int ColumnsPerBreakpoint { get; set; }
    public string? BreakpointSize { get; set; }
    public string? CardAspectRatioHeight { get; set; }
    public string? CardAspectRatioWidth { get; set; }
}

#endregion