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

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;

namespace Microsoft.AspNetCore.StaticFiles;

/// <summary>
/// Defines *all* the logger messages produced by static files
/// </summary>
internal static partial class LoggerExtensions
{
    [LoggerMessage(1, LogLevel.Debug, "{Method} requests are not supported", EventName = "MethodNotSupported")]
    public static partial void RequestMethodNotSupported(this ILogger logger, string method);

    [LoggerMessage(2, LogLevel.Information, "Sending file. Request path: '{VirtualPath}'. Physical path: '{PhysicalPath}'", EventName = "FileServed")]
    private static partial void FileServedCore(this ILogger logger, string virtualPath, string physicalPath);

    public static void FileServed(this ILogger logger, string virtualPath, string physicalPath)
    {
        if (string.IsNullOrEmpty(physicalPath))
        {
            physicalPath = "N/A";
        }
        FileServedCore(logger, virtualPath, physicalPath);
    }

    [LoggerMessage(15, LogLevel.Debug, "Static files was skipped as the request already matched an endpoint.", EventName = "EndpointMatched")]
    public static partial void EndpointMatched(this ILogger logger);

    [LoggerMessage(3, LogLevel.Debug, "The request path {Path} does not match the path filter", EventName = "PathMismatch")]
    public static partial void PathMismatch(this ILogger logger, string path);

    [LoggerMessage(4, LogLevel.Debug, "The request path {Path} does not match a supported file type", EventName = "FileTypeNotSupported")]
    public static partial void FileTypeNotSupported(this ILogger logger, string path);

    [LoggerMessage(5, LogLevel.Debug, "The request path {Path} does not match an existing file", EventName = "FileNotFound")]
    public static partial void FileNotFound(this ILogger logger, string path);

    [LoggerMessage(6, LogLevel.Information, "The file {Path} was not modified", EventName = "FileNotModified")]
    public static partial void FileNotModified(this ILogger logger, string path);

    [LoggerMessage(7, LogLevel.Information, "Precondition for {Path} failed", EventName = "PreconditionFailed")]
    public static partial void PreconditionFailed(this ILogger logger, string path);

    [LoggerMessage(8, LogLevel.Debug, "Handled. Status code: {StatusCode} File: {Path}", EventName = "Handled")]
    public static partial void Handled(this ILogger logger, int statusCode, string path);

    [LoggerMessage(9, LogLevel.Warning, "Range not satisfiable for {Path}", EventName = "RangeNotSatisfiable")]
    public static partial void RangeNotSatisfiable(this ILogger logger, string path);

    [LoggerMessage(10, LogLevel.Information, "Sending {Range} of file {Path}", EventName = "SendingFileRange")]
    public static partial void SendingFileRange(this ILogger logger, StringValues range, string path);

    [LoggerMessage(11, LogLevel.Debug, "Copying {Range} of file {Path} to the response body", EventName = "CopyingFileRange")]
    public static partial void CopyingFileRange(this ILogger logger, StringValues range, string path);

    [LoggerMessage(14, LogLevel.Debug, "The file transmission was cancelled", EventName = "WriteCancelled")]
    public static partial void WriteCancelled(this ILogger logger, Exception ex);

    [LoggerMessage(16, LogLevel.Warning,
        "The WebRootPath was not found: {WebRootPath}. Static files may be unavailable.", EventName = "WebRootPathNotFound")]
    public static partial void WebRootPathNotFound(this ILogger logger, string webRootPath);
}
