// Copyright (c) MudBlazor 2021
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Connected.Annotations;
using Connected.Extensions;
using Connected.Utilities;
using Microsoft.AspNetCore.Components;

namespace Connected.Components;

public partial class TimelineItem : UIComponent, IDisposable

{
   protected string Classnames =>
       new CssBuilder("timeline-item")
           .AddClass($"timeline-item-{TimelineAlign.ToDescription()}")
           .AddClass(AdditionalClassList)
           .Build();

   protected string DotClassnames =>
   new CssBuilder("timeline-item-dot")
     .AddClass($"timeline-dot-size-{Size.ToDescription()}")
     .AddClass($"elevation-{Elevation.ToString()}")
   .Build();

   protected string DotInnerClassnames =>
   new CssBuilder("timeline-item-dot-inner")
     .AddClass($"timeline-dot-fill", Variant == Variant.Filled)
     .AddClass($"timeline-dot-{Color.ToDescription()}")
   .Build();

   [CascadingParameter] protected internal ItemsControlBase<TimelineItem> Parent { get; set; }

   /// <summary>
   /// Dot Glyph
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public string Icon { get; set; }

   /// <summary>
   /// Variant of the dot.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public Variant Variant { get; set; } = Variant.Outlined;

   /// <summary>
   /// User styles, applied to the lineItem dot.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public string DotStyle { get; set; }

   /// <summary>
   /// Color of the dot.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public ThemeColor Color { get; set; } = ThemeColor.Default;

   /// <summary>
   /// Size of the dot.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public Size Size { get; set; } = Size.Small;

   /// <summary>
   /// Elevation of the dot. The higher the number, the heavier the drop-shadow.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public int Elevation { set; get; } = 1;

   /// <summary>
   /// Overrides Timeline Parents default sorting method in Default and Reverse mode.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Behavior)]
   public TimelineAlign TimelineAlign { get; set; }

   /// <summary>
   /// If true, dot will not be displayed.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public bool HideDot { get; set; }

   /// <summary>
   /// If used renders child content of the ItemOpposite.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Behavior)]
   public RenderFragment ItemOpposite { get; set; }

   /// <summary>
   /// If used renders child content of the ItemContent.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Behavior)]
   public RenderFragment ItemContent { get; set; }

   /// <summary>
   /// If used renders child content of the ItemDot.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Dot)]
   public RenderFragment ItemDot { get; set; }

   /// <summary>
   /// Optional child content if no other RenderFragments is used.
   /// </summary>
   [Parameter]
   [Category(CategoryTypes.Timeline.Behavior)]
   public RenderFragment ChildContent { get; set; }

   protected override Task OnInitializedAsync()
   {
      Parent?.Items.Add(this);
      return Task.CompletedTask;
   }

   private void Select()
   {
      var myIndex = Parent?.Items.IndexOf(this);
      Parent?.MoveTo(myIndex ?? 0);
   }

   public void Dispose()
   {
      Parent?.Items.Remove(this);
   }


}
