using Markdig;
using Microsoft.AspNetCore.Components;

namespace JobsJobsJobs.Client.Shared
{
    /// <summary>
    /// Code-behind for the Markdown Editor component
    /// </summary>
    public partial class MarkdownEditor : ComponentBase
    {
        /// <summary>
        /// Pipeline with most extensions enabled
        /// </summary>
        private readonly MarkdownPipeline _pipeline = new MarkdownPipelineBuilder()
            .UseSmartyPants().UseAdvancedExtensions().Build();

        /// <summary>
        /// Whether the preview should be shown
        /// </summary>
        private bool _showPreview = false;

        /// <summary>
        /// Backing field for the plain-text representation of this document
        /// </summary>
        private string _text = "";

        /// <summary>
        /// The plain-text (Markdown source)
        /// </summary>
        private string PlainText {
            get => _text;
            set
            {
                _text = value;
                TextChanged.InvokeAsync(_text).ConfigureAwait(false).GetAwaiter().GetResult();
            }
        }

        /// <summary>
        /// The rendered HTML
        /// </summary>
        private MarkupString PreviewText => (MarkupString)Markdown.ToHtml(_text, _pipeline);

        /// <summary>
        /// CSS class for the "Markdown" tab (active if preview not shown)
        /// </summary>
        private string MarkdownClass => _showPreview ? "" : "active";

        /// <summary>
        /// CSS class for the "Preview" tab (active if preview shown)
        /// </summary>
        private string PreviewClass => _showPreview ? "active" : "";

        /// <summary>
        /// The ID used for the textarea; allows for a label to be assigned
        /// </summary>
        [Parameter]
        public string Id { get; set; } = "";

        /// <summary>
        /// The text value of the Markdown
        /// </summary>
        [Parameter]
        public string Text { get; set; } = "";

        /// <summary>
        /// Event fired when the text is changed
        /// </summary>
        [Parameter]
        public EventCallback<string> TextChanged { get; set; }

        protected override void OnInitialized()
        {
            base.OnInitialized();
            _text = Text;
        }

        /// <summary>
        /// Show the Markdown editor
        /// </summary>
        private void ShowMarkdown() => _showPreview = false;

        /// <summary>
        /// Show the Markdown preview
        /// </summary>
        private void ShowPreview() => _showPreview = true;
    }
}