// Code generated by ogen, DO NOT EDIT.

package api

import (
	"net/http"
	"net/url"
	"strings"

	"github.com/ogen-go/ogen/uri"
)

func (s *Server) cutPrefix(path string) (string, bool) {
	prefix := s.cfg.Prefix
	if prefix == "" {
		return path, true
	}
	if !strings.HasPrefix(path, prefix) {
		// Prefix doesn't match.
		return "", false
	}
	// Cut prefix from the path.
	return strings.TrimPrefix(path, prefix), true
}

// ServeHTTP serves http request as defined by OpenAPI v3 specification,
// calling handler that matches the path or returning not found error.
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	elem := r.URL.Path
	elemIsEscaped := false
	if rawPath := r.URL.RawPath; rawPath != "" {
		if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok {
			elem = normalized
			elemIsEscaped = strings.ContainsRune(elem, '%')
		}
	}

	elem, ok := s.cutPrefix(elem)
	if !ok || len(elem) == 0 {
		s.notFound(w, r)
		return
	}
	args := [1]string{}

	// Static code generated router with unwrapped path search.
	switch {
	default:
		if len(elem) == 0 {
			break
		}
		switch elem[0] {
		case '/': // Prefix: "/s"
			origElem := elem
			if l := len("/s"); len(elem) >= l && elem[0:l] == "/s" {
				elem = elem[l:]
			} else {
				break
			}

			if len(elem) == 0 {
				break
			}
			switch elem[0] {
			case 'c': // Prefix: "cript"
				origElem := elem
				if l := len("cript"); len(elem) >= l && elem[0:l] == "cript" {
					elem = elem[l:]
				} else {
					break
				}

				if len(elem) == 0 {
					break
				}
				switch elem[0] {
				case '-': // Prefix: "-policy"
					origElem := elem
					if l := len("-policy"); len(elem) >= l && elem[0:l] == "-policy" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						switch r.Method {
						case "POST":
							s.handleCreateScriptPolicyRequest([0]string{}, elemIsEscaped, w, r)
						default:
							s.notAllowed(w, r, "POST")
						}

						return
					}
					switch elem[0] {
					case '/': // Prefix: "/hash/"
						origElem := elem
						if l := len("/hash/"); len(elem) >= l && elem[0:l] == "/hash/" {
							elem = elem[l:]
						} else {
							break
						}

						// Param: "FromScriptHash"
						// Leaf parameter
						args[0] = elem
						elem = ""

						if len(elem) == 0 {
							// Leaf node.
							switch r.Method {
							case "GET":
								s.handleGetScriptPolicyFromHashRequest([1]string{
									args[0],
								}, elemIsEscaped, w, r)
							default:
								s.notAllowed(w, r, "GET")
							}

							return
						}

						elem = origElem
					}

					elem = origElem
				case 's': // Prefix: "s"
					origElem := elem
					if l := len("s"); len(elem) >= l && elem[0:l] == "s" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						switch r.Method {
						case "POST":
							s.handleCreateScriptRequest([0]string{}, elemIsEscaped, w, r)
						default:
							s.notAllowed(w, r, "POST")
						}

						return
					}
					switch elem[0] {
					case '/': // Prefix: "/"
						origElem := elem
						if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
							elem = elem[l:]
						} else {
							break
						}

						// Param: "ScriptID"
						// Leaf parameter
						args[0] = elem
						elem = ""

						if len(elem) == 0 {
							// Leaf node.
							switch r.Method {
							case "GET":
								s.handleGetScriptRequest([1]string{
									args[0],
								}, elemIsEscaped, w, r)
							default:
								s.notAllowed(w, r, "GET")
							}

							return
						}

						elem = origElem
					}

					elem = origElem
				}

				elem = origElem
			case 'u': // Prefix: "ubmissions/"
				origElem := elem
				if l := len("ubmissions/"); len(elem) >= l && elem[0:l] == "ubmissions/" {
					elem = elem[l:]
				} else {
					break
				}

				// Param: "SubmissionID"
				// Match until "/"
				idx := strings.IndexByte(elem, '/')
				if idx < 0 {
					idx = len(elem)
				}
				args[0] = elem[:idx]
				elem = elem[idx:]

				if len(elem) == 0 {
					break
				}
				switch elem[0] {
				case '/': // Prefix: "/"
					origElem := elem
					if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						break
					}
					switch elem[0] {
					case 'm': // Prefix: "model"
						origElem := elem
						if l := len("model"); len(elem) >= l && elem[0:l] == "model" {
							elem = elem[l:]
						} else {
							break
						}

						if len(elem) == 0 {
							// Leaf node.
							switch r.Method {
							case "POST":
								s.handleUpdateSubmissionModelRequest([1]string{
									args[0],
								}, elemIsEscaped, w, r)
							default:
								s.notAllowed(w, r, "POST")
							}

							return
						}

						elem = origElem
					case 's': // Prefix: "status/"
						origElem := elem
						if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" {
							elem = elem[l:]
						} else {
							break
						}

						if len(elem) == 0 {
							break
						}
						switch elem[0] {
						case 'r': // Prefix: "releaser-released"
							origElem := elem
							if l := len("releaser-released"); len(elem) >= l && elem[0:l] == "releaser-released" {
								elem = elem[l:]
							} else {
								break
							}

							if len(elem) == 0 {
								// Leaf node.
								switch r.Method {
								case "POST":
									s.handleActionSubmissionReleasedRequest([1]string{
										args[0],
									}, elemIsEscaped, w, r)
								default:
									s.notAllowed(w, r, "POST")
								}

								return
							}

							elem = origElem
						case 'v': // Prefix: "validator-"
							origElem := elem
							if l := len("validator-"); len(elem) >= l && elem[0:l] == "validator-" {
								elem = elem[l:]
							} else {
								break
							}

							if len(elem) == 0 {
								break
							}
							switch elem[0] {
							case 'f': // Prefix: "failed"
								origElem := elem
								if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch r.Method {
									case "POST":
										s.handleActionSubmissionAcceptedRequest([1]string{
											args[0],
										}, elemIsEscaped, w, r)
									default:
										s.notAllowed(w, r, "POST")
									}

									return
								}

								elem = origElem
							case 'u': // Prefix: "uploaded"
								origElem := elem
								if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch r.Method {
									case "POST":
										s.handleActionSubmissionUploadedRequest([1]string{
											args[0],
										}, elemIsEscaped, w, r)
									default:
										s.notAllowed(w, r, "POST")
									}

									return
								}

								elem = origElem
							case 'v': // Prefix: "validated"
								origElem := elem
								if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch r.Method {
									case "POST":
										s.handleActionSubmissionValidatedRequest([1]string{
											args[0],
										}, elemIsEscaped, w, r)
									default:
										s.notAllowed(w, r, "POST")
									}

									return
								}

								elem = origElem
							}

							elem = origElem
						}

						elem = origElem
					}

					elem = origElem
				}

				elem = origElem
			}

			elem = origElem
		}
	}
	s.notFound(w, r)
}

// Route is route object.
type Route struct {
	name        string
	summary     string
	operationID string
	pathPattern string
	count       int
	args        [1]string
}

// Name returns ogen operation name.
//
// It is guaranteed to be unique and not empty.
func (r Route) Name() string {
	return r.name
}

// Summary returns OpenAPI summary.
func (r Route) Summary() string {
	return r.summary
}

// OperationID returns OpenAPI operationId.
func (r Route) OperationID() string {
	return r.operationID
}

// PathPattern returns OpenAPI path.
func (r Route) PathPattern() string {
	return r.pathPattern
}

// Args returns parsed arguments.
func (r Route) Args() []string {
	return r.args[:r.count]
}

// FindRoute finds Route for given method and path.
//
// Note: this method does not unescape path or handle reserved characters in path properly. Use FindPath instead.
func (s *Server) FindRoute(method, path string) (Route, bool) {
	return s.FindPath(method, &url.URL{Path: path})
}

// FindPath finds Route for given method and URL.
func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
	var (
		elem = u.Path
		args = r.args
	)
	if rawPath := u.RawPath; rawPath != "" {
		if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok {
			elem = normalized
		}
		defer func() {
			for i, arg := range r.args[:r.count] {
				if unescaped, err := url.PathUnescape(arg); err == nil {
					r.args[i] = unescaped
				}
			}
		}()
	}

	elem, ok := s.cutPrefix(elem)
	if !ok {
		return r, false
	}

	// Static code generated router with unwrapped path search.
	switch {
	default:
		if len(elem) == 0 {
			break
		}
		switch elem[0] {
		case '/': // Prefix: "/s"
			origElem := elem
			if l := len("/s"); len(elem) >= l && elem[0:l] == "/s" {
				elem = elem[l:]
			} else {
				break
			}

			if len(elem) == 0 {
				break
			}
			switch elem[0] {
			case 'c': // Prefix: "cript"
				origElem := elem
				if l := len("cript"); len(elem) >= l && elem[0:l] == "cript" {
					elem = elem[l:]
				} else {
					break
				}

				if len(elem) == 0 {
					break
				}
				switch elem[0] {
				case '-': // Prefix: "-policy"
					origElem := elem
					if l := len("-policy"); len(elem) >= l && elem[0:l] == "-policy" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						switch method {
						case "POST":
							r.name = CreateScriptPolicyOperation
							r.summary = "Create a new script policy"
							r.operationID = "createScriptPolicy"
							r.pathPattern = "/script-policy"
							r.args = args
							r.count = 0
							return r, true
						default:
							return
						}
					}
					switch elem[0] {
					case '/': // Prefix: "/hash/"
						origElem := elem
						if l := len("/hash/"); len(elem) >= l && elem[0:l] == "/hash/" {
							elem = elem[l:]
						} else {
							break
						}

						// Param: "FromScriptHash"
						// Leaf parameter
						args[0] = elem
						elem = ""

						if len(elem) == 0 {
							// Leaf node.
							switch method {
							case "GET":
								r.name = GetScriptPolicyFromHashOperation
								r.summary = "Get the policy for the given hash of script source code"
								r.operationID = "getScriptPolicyFromHash"
								r.pathPattern = "/script-policy/hash/{FromScriptHash}"
								r.args = args
								r.count = 1
								return r, true
							default:
								return
							}
						}

						elem = origElem
					}

					elem = origElem
				case 's': // Prefix: "s"
					origElem := elem
					if l := len("s"); len(elem) >= l && elem[0:l] == "s" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						switch method {
						case "POST":
							r.name = CreateScriptOperation
							r.summary = "Create a new script"
							r.operationID = "createScript"
							r.pathPattern = "/scripts"
							r.args = args
							r.count = 0
							return r, true
						default:
							return
						}
					}
					switch elem[0] {
					case '/': // Prefix: "/"
						origElem := elem
						if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
							elem = elem[l:]
						} else {
							break
						}

						// Param: "ScriptID"
						// Leaf parameter
						args[0] = elem
						elem = ""

						if len(elem) == 0 {
							// Leaf node.
							switch method {
							case "GET":
								r.name = GetScriptOperation
								r.summary = "Get the specified script by ID"
								r.operationID = "getScript"
								r.pathPattern = "/scripts/{ScriptID}"
								r.args = args
								r.count = 1
								return r, true
							default:
								return
							}
						}

						elem = origElem
					}

					elem = origElem
				}

				elem = origElem
			case 'u': // Prefix: "ubmissions/"
				origElem := elem
				if l := len("ubmissions/"); len(elem) >= l && elem[0:l] == "ubmissions/" {
					elem = elem[l:]
				} else {
					break
				}

				// Param: "SubmissionID"
				// Match until "/"
				idx := strings.IndexByte(elem, '/')
				if idx < 0 {
					idx = len(elem)
				}
				args[0] = elem[:idx]
				elem = elem[idx:]

				if len(elem) == 0 {
					break
				}
				switch elem[0] {
				case '/': // Prefix: "/"
					origElem := elem
					if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
						elem = elem[l:]
					} else {
						break
					}

					if len(elem) == 0 {
						break
					}
					switch elem[0] {
					case 'm': // Prefix: "model"
						origElem := elem
						if l := len("model"); len(elem) >= l && elem[0:l] == "model" {
							elem = elem[l:]
						} else {
							break
						}

						if len(elem) == 0 {
							// Leaf node.
							switch method {
							case "POST":
								r.name = UpdateSubmissionModelOperation
								r.summary = "Update model following role restrictions"
								r.operationID = "updateSubmissionModel"
								r.pathPattern = "/submissions/{SubmissionID}/model"
								r.args = args
								r.count = 1
								return r, true
							default:
								return
							}
						}

						elem = origElem
					case 's': // Prefix: "status/"
						origElem := elem
						if l := len("status/"); len(elem) >= l && elem[0:l] == "status/" {
							elem = elem[l:]
						} else {
							break
						}

						if len(elem) == 0 {
							break
						}
						switch elem[0] {
						case 'r': // Prefix: "releaser-released"
							origElem := elem
							if l := len("releaser-released"); len(elem) >= l && elem[0:l] == "releaser-released" {
								elem = elem[l:]
							} else {
								break
							}

							if len(elem) == 0 {
								// Leaf node.
								switch method {
								case "POST":
									r.name = ActionSubmissionReleasedOperation
									r.summary = "(Internal endpoint) Role Releaser changes status from releasing -> released"
									r.operationID = "actionSubmissionReleased"
									r.pathPattern = "/submissions/{SubmissionID}/status/releaser-released"
									r.args = args
									r.count = 1
									return r, true
								default:
									return
								}
							}

							elem = origElem
						case 'v': // Prefix: "validator-"
							origElem := elem
							if l := len("validator-"); len(elem) >= l && elem[0:l] == "validator-" {
								elem = elem[l:]
							} else {
								break
							}

							if len(elem) == 0 {
								break
							}
							switch elem[0] {
							case 'f': // Prefix: "failed"
								origElem := elem
								if l := len("failed"); len(elem) >= l && elem[0:l] == "failed" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch method {
									case "POST":
										r.name = ActionSubmissionAcceptedOperation
										r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Accepted"
										r.operationID = "actionSubmissionAccepted"
										r.pathPattern = "/submissions/{SubmissionID}/status/validator-failed"
										r.args = args
										r.count = 1
										return r, true
									default:
										return
									}
								}

								elem = origElem
							case 'u': // Prefix: "uploaded"
								origElem := elem
								if l := len("uploaded"); len(elem) >= l && elem[0:l] == "uploaded" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch method {
									case "POST":
										r.name = ActionSubmissionUploadedOperation
										r.summary = "(Internal endpoint) Role Validator changes status from Uploading -> Uploaded"
										r.operationID = "actionSubmissionUploaded"
										r.pathPattern = "/submissions/{SubmissionID}/status/validator-uploaded"
										r.args = args
										r.count = 1
										return r, true
									default:
										return
									}
								}

								elem = origElem
							case 'v': // Prefix: "validated"
								origElem := elem
								if l := len("validated"); len(elem) >= l && elem[0:l] == "validated" {
									elem = elem[l:]
								} else {
									break
								}

								if len(elem) == 0 {
									// Leaf node.
									switch method {
									case "POST":
										r.name = ActionSubmissionValidatedOperation
										r.summary = "(Internal endpoint) Role Validator changes status from Validating -> Validated"
										r.operationID = "actionSubmissionValidated"
										r.pathPattern = "/submissions/{SubmissionID}/status/validator-validated"
										r.args = args
										r.count = 1
										return r, true
									default:
										return
									}
								}

								elem = origElem
							}

							elem = origElem
						}

						elem = origElem
					}

					elem = origElem
				}

				elem = origElem
			}

			elem = origElem
		}
	}
	return r, false
}