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

using System;
using Microsoft.AspNetCore.Http;

namespace Microsoft.AspNetCore.HttpLogging
{
    /// <summary>
    /// Flags used to control which parts of the
    /// request and response are logged in W3C format.
    /// </summary>
    [Flags]
    public enum W3CLoggingFields : long
    {
        /// <summary>
        /// No logging.
        /// </summary>
        None = 0x0,

        /// <summary>
        /// Flag for logging the date
        /// that the activity occurred.
        /// </summary>
        Date = 0x1,

        /// <summary>
        /// Flag for logging the time
        /// that the activity occurred.
        /// </summary>
        Time = 0x2,

        /// <summary>
        /// Flag for logging the IP address
        /// of the client that accessed the server.
        /// </summary>
        ClientIpAddress = 0x4,

        /// <summary>
        /// Flag for logging the name of the
        /// authenticated user that accessed the server.
        /// UserName contents can contain private information
        /// which may have regulatory concerns under GDPR
        /// and other laws. UserName should not be logged
        /// unless logs are secure and access controlled
        /// and the privacy impact assessed.
        /// </summary>
        UserName = 0x8,

        /// <summary>
        /// Flag for logging the name of the
        /// server on which the log entry was generated.
        /// </summary>
        ServerName = 0x10,

        /// <summary>
        /// Flag for logging the IP address of the
        /// server on which the log entry was generated.
        /// </summary>
        ServerIpAddress = 0x20,

        /// <summary>
        /// Flag for logging the port number
        /// the client is connected to.
        /// </summary>
        ServerPort = 0x40,

        /// <summary>
        /// Flag for logging the action
        /// the client was trying to perform.
        /// </summary>
        Method = 0x80,

        /// <summary>
        /// Flag for logging the resource accessed.
        /// </summary>
        UriStem = 0x100,

        /// <summary>
        /// Flag for logging the query, if any,
        /// the client was trying to perform.
        /// </summary>
        UriQuery = 0x200,

        /// <summary>
        /// Flag for logging the HTTP response status code.
        /// </summary>
        ProtocolStatus = 0x400,

        /// <summary>
        /// Flag for logging the duration of time,
        /// in milliseconds, that the action consumed.
        /// </summary>
        TimeTaken = 0x800,

        /// <summary>
        /// Flag for logging the protocol (HTTP, FTP) version
        /// used by the client. For HTTP this will be either
        /// HTTP 1.0 or HTTP 1.1.
        /// </summary>
        ProtocolVersion = 0x1000,

        /// <summary>
        /// Flag for logging the content of the host header.
        /// </summary>
        Host = 0x2000,

        /// <summary>
        /// Flag for logging the requesting user agent.
        /// </summary>
        UserAgent = 0x4000,

        /// <summary>
        /// Flag for logging the content of the cookie
        /// sent by the client, if any.
        /// Cookie contents can contain authentication tokens,
        /// or private information which may have regulatory concerns
        /// under GDPR and other laws. Cookies should not be logged
        /// unless logs are secure and access controlled
        /// and the privacy impact assessed.
        /// </summary>
        Cookie = 0x8000,

        /// <summary>
        /// Flag for logging the previous site visited by the user,
        /// which provided a link to the current site, if any.
        /// </summary>
        Referer = 0x10000,

        /// <summary>
        /// Flag for logging properties that are part of the <see cref="ConnectionInfo"/>
        /// Includes <see cref="ClientIpAddress"/>, <see cref="ServerIpAddress"/> and <see cref="ServerPort"/>.
        /// </summary>
        ConnectionInfoFields = ClientIpAddress | ServerIpAddress | ServerPort,

        /// <summary>
        /// Flag for logging properties that are part of the <see cref="HttpRequest.Headers"/>
        /// Includes <see cref="Host"/>, <see cref="Referer"/>, and <see cref="UserAgent"/>.
        /// </summary>
        RequestHeaders = Host | Referer | UserAgent,

        /// <summary>
        /// Flag for logging properties that are part of the <see cref="HttpRequest"/>
        /// Includes <see cref="UriStem"/>, <see cref="UriQuery"/>, <see cref="ProtocolVersion"/>,
        /// <see cref="Method"/>, <see cref="Host"/>, <see cref="Referer"/>,
        /// and <see cref="UserAgent"/>.
        /// </summary>
        Request = UriStem | UriQuery | ProtocolVersion | Method | RequestHeaders,

        /// <summary>
        /// Flag for logging all possible fields.
        /// Includes <see cref="Date"/>, <see cref="Time"/>, <see cref="ClientIpAddress"/>,
        /// <see cref="ServerName"/>, <see cref="ServerIpAddress"/>, <see cref="ServerPort"/>,
        /// <see cref="Method"/>, <see cref="UriStem"/>, <see cref="UriQuery"/>,
        /// <see cref="ProtocolStatus"/>, <see cref="TimeTaken"/>, <see cref="ProtocolVersion"/>,
        /// <see cref="Host"/>, <see cref="UserAgent"/>, <see cref="Referer"/>,
        /// <see cref="UserName"/>, and <see cref="Cookie"/>.
        /// </summary>
        All = Date | Time | ServerName | Method | UriStem | UriQuery | ProtocolStatus |
            TimeTaken | ProtocolVersion | Host | UserAgent | Referer | ConnectionInfoFields |
            UserName | Cookie
    }
}
