// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace Microsoft.AspNetCore.Mvc.Razor;

/// <summary>
/// Represents properties and methods that are used by <see cref="RazorView"/> for execution.
/// </summary>
public interface IRazorPage
{
    /// <summary>
    /// Gets or sets the view context of the rendering view.
    /// </summary>
    ViewContext ViewContext { get; set; }

    /// <summary>
    /// Gets or sets the body content.
    /// </summary>
    IHtmlContent? BodyContent { get; set; }

    /// <summary>
    /// Gets or sets a flag that determines if the layout of this page is being rendered.
    /// </summary>
    /// <remarks>
    /// Sections defined in a page are deferred and executed as part of the layout page.
    /// When this flag is set, all write operations performed by the page are part of a
    /// section being rendered.
    /// </remarks>
    bool IsLayoutBeingRendered { get; set; }

    /// <summary>
    /// Gets the application base relative path to the page.
    /// </summary>
    string Path { get; set; }

    /// <summary>
    /// Gets or sets the path of a layout page.
    /// </summary>
    string? Layout { get; set; }

    /// <summary>
    /// Gets or sets the sections that can be rendered by this page.
    /// </summary>
    IDictionary<string, RenderAsyncDelegate> PreviousSectionWriters { get; set; }

    /// <summary>
    /// Gets the sections that are defined by this page.
    /// </summary>
    IDictionary<string, RenderAsyncDelegate> SectionWriters { get; }

    /// <summary>
    /// Renders the page and writes the output to the <see cref="ViewContext.Writer"/>.
    /// </summary>
    /// <returns>A task representing the result of executing the page.</returns>
    Task ExecuteAsync();

    /// <summary>
    /// Verifies that all sections defined in <see cref="PreviousSectionWriters"/> were rendered, or
    /// the body was rendered if no sections were defined.
    /// </summary>
    /// <exception cref="System.InvalidOperationException">if one or more sections were not rendered or if no sections were
    /// defined and the body was not rendered.</exception>
    void EnsureRenderedBodyOrSections();
}
