#nullable disable
#pragma warning disable CS1591
using System;
namespace MediaBrowser.Model.Services
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class RouteAttribute : Attribute
    {
        /// 
        ///     Initializes an instance of the  class.
        /// 
        /// 
        ///     The path template to map to the request.  See
        ///        RouteAttribute.Path
        ///        for details on the correct format.
        /// 
        public RouteAttribute(string path)
            : this(path, null)
        {
        }
        /// 
        ///     Initializes an instance of the  class.
        /// 
        /// 
        ///     The path template to map to the request.  See
        ///         RouteAttribute.Path
        ///         for details on the correct format.
        /// 
        /// A comma-delimited list of HTTP verbs supported by the
        ///     service.  If unspecified, all verbs are assumed to be supported.
        public RouteAttribute(string path, string verbs)
        {
            Path = path;
            Verbs = verbs;
        }
        /// 
        ///     Gets or sets the path template to be mapped to the request.
        /// 
        /// 
        ///     A  value providing the path mapped to
        ///     the request.  Never .
        /// 
        /// 
        ///     Some examples of valid paths are:
        ///
        ///     
        ///         - "/Inventory"
 
        ///         - "/Inventory/{Category}/{ItemId}"
 
        ///         - "/Inventory/{ItemPath*}"
 
        ///     
        ///
        ///     Variables are specified within "{}"
        ///     brackets.  Each variable in the path is mapped to the same-named property
        ///     on the request DTO.  At runtime, ServiceStack will parse the
        ///     request URL, extract the variable values, instantiate the request DTO,
        ///     and assign the variable values into the corresponding request properties,
        ///     prior to passing the request DTO to the service object for processing.
        ///
        ///     It is not necessary to specify all request properties as
        ///     variables in the path.  For unspecified properties, callers may provide
        ///     values in the query string.  For example: the URL
        ///     "http://services/Inventory?Category=Books&ItemId=12345" causes the same
        ///     request DTO to be processed as "http://services/Inventory/Books/12345",
        ///     provided that the paths "/Inventory" (which supports the first URL) and
        ///     "/Inventory/{Category}/{ItemId}" (which supports the second URL)
        ///     are both mapped to the request DTO.
        ///
        ///     Please note that while it is possible to specify property values
        ///     in the query string, it is generally considered to be less RESTful and
        ///     less desirable than to specify them as variables in the path.  Using the
        ///     query string to specify property values may also interfere with HTTP
        ///     caching.
        ///
        ///     The final variable in the path may contain a "*" suffix
        ///     to grab all remaining segments in the path portion of the request URL and assign
        ///     them to a single property on the request DTO.
        ///     For example, if the path "/Inventory/{ItemPath*}" is mapped to the request DTO,
        ///     then the request URL "http://services/Inventory/Books/12345" will result
        ///     in a request DTO whose ItemPath property contains "Books/12345".
        ///     You may only specify one such variable in the path, and it must be positioned at
        ///     the end of the path.
        /// 
        public string Path { get; set; }
        /// 
        ///    Gets or sets short summary of what the route does.
        /// 
        public string Summary { get; set; }
        public string Description { get; set; }
        public bool IsHidden { get; set; }
        /// 
        ///    Gets or sets longer text to explain the behaviour of the route.
        /// 
        public string Notes { get; set; }
        /// 
        ///     Gets or sets a comma-delimited list of HTTP verbs supported by the service, such as
        ///     "GET,PUT,POST,DELETE".
        /// 
        /// 
        ///     A  providing a comma-delimited list of HTTP verbs supported
        ///     by the service,  or empty if all verbs are supported.
        /// 
        public string Verbs { get; set; }
        /// 
        /// Used to rank the precedences of route definitions in reverse routing.
        /// i.e. Priorities below 0 are auto-generated have less precedence.
        /// 
        public int Priority { get; set; }
        protected bool Equals(RouteAttribute other)
        {
            return base.Equals(other)
                && string.Equals(Path, other.Path)
                && string.Equals(Summary, other.Summary)
                && string.Equals(Notes, other.Notes)
                && string.Equals(Verbs, other.Verbs)
                && Priority == other.Priority;
        }
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj))
            {
                return false;
            }
            if (ReferenceEquals(this, obj))
            {
                return true;
            }
            if (obj.GetType() != this.GetType())
            {
                return false;
            }
            return Equals((RouteAttribute)obj);
        }
        public override int GetHashCode()
        {
            unchecked
            {
                var hashCode = base.GetHashCode();
                hashCode = (hashCode * 397) ^ (Path != null ? Path.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ (Summary != null ? Summary.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ (Notes != null ? Notes.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ (Verbs != null ? Verbs.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ Priority;
                return hashCode;
            }
        }
    }
}