//
// This file is generated by grafana-app-sdk
// DO NOT EDIT
//

package manifestdata

import (
	"fmt"
	"strings"

	"github.com/grafana/grafana-app-sdk/app"
	"github.com/grafana/grafana-app-sdk/resource"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/kube-openapi/pkg/spec3"
	"k8s.io/kube-openapi/pkg/validation/spec"

	v1alpha1 "github.com/grafana/grafana/apps/dashvalidator/pkg/apis/dashvalidator/v1alpha1"
)

var appManifestData = app.ManifestData{
	AppName:          "dashvalidator",
	AppDisplayName:   "dashvalidator",
	Group:            "dashvalidator.grafana.app",
	PreferredVersion: "v1alpha1",
	Versions: []app.ManifestVersion{
		{
			Name:   "v1alpha1",
			Served: true,
			Kinds:  []app.ManifestVersionKind{},
			Routes: app.ManifestVersionRoutes{
				Namespaced: map[string]spec3.PathProps{
					"/check": {
						Post: &spec3.Operation{
							OperationProps: spec3.OperationProps{

								OperationId: "createCheck",

								RequestBody: &spec3.RequestBody{
									RequestBodyProps: spec3.RequestBodyProps{

										Required: true,
										Content: map[string]*spec3.MediaType{
											"application/json": {
												MediaTypeProps: spec3.MediaTypeProps{
													Schema: &spec.Schema{
														SchemaProps: spec.SchemaProps{
															Type: []string{"object"},
															Properties: map[string]spec.Schema{
																"dashboardJson": {
																	SchemaProps: spec.SchemaProps{
																		Type: []string{"object"},
																		AdditionalProperties: &spec.SchemaOrBool{
																			Allows: true,
																		},
																	},
																},
																"datasourceMappings": {
																	SchemaProps: spec.SchemaProps{
																		Type: []string{"array"},
																		Items: &spec.SchemaOrArray{
																			Schema: &spec.Schema{
																				SchemaProps: spec.SchemaProps{
																					Type: []string{"object"},
																					Properties: map[string]spec.Schema{
																						"name": {
																							SchemaProps: spec.SchemaProps{
																								Type: []string{"string"},
																							},
																						},
																						"type": {
																							SchemaProps: spec.SchemaProps{
																								Type: []string{"string"},
																							},
																						},
																						"uid": {
																							SchemaProps: spec.SchemaProps{
																								Type: []string{"string"},
																							},
																						},
																					},
																					Required: []string{
																						"uid",
																						"type",
																					},
																				}},
																		},
																	},
																},
															},
															Required: []string{
																"dashboardJson",
																"datasourceMappings",
															},
														}},
												}},
										},
									}},
								Responses: &spec3.Responses{
									ResponsesProps: spec3.ResponsesProps{
										Default: &spec3.Response{
											ResponseProps: spec3.ResponseProps{
												Description: "Default OK response",
												Content: map[string]*spec3.MediaType{
													"application/json": {
														MediaTypeProps: spec3.MediaTypeProps{
															Schema: &spec.Schema{
																SchemaProps: spec.SchemaProps{
																	Type: []string{"object"},
																	Properties: map[string]spec.Schema{
																		"apiVersion": {
																			SchemaProps: spec.SchemaProps{
																				Type:        []string{"string"},
																				Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
																			},
																		},
																		"compatibilityScore": {
																			SchemaProps: spec.SchemaProps{
																				Type: []string{"number"},
																			},
																		},
																		"datasourceResults": {
																			SchemaProps: spec.SchemaProps{
																				Type: []string{"array"},
																				Items: &spec.SchemaOrArray{
																					Schema: &spec.Schema{
																						SchemaProps: spec.SchemaProps{
																							Type: []string{"object"},
																							Properties: map[string]spec.Schema{
																								"checkedQueries": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"integer"},
																									},
																								},
																								"compatibilityScore": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"number"},
																									},
																								},
																								"foundMetrics": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"integer"},
																									},
																								},
																								"missingMetrics": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"array"},
																										Items: &spec.SchemaOrArray{
																											Schema: &spec.Schema{
																												SchemaProps: spec.SchemaProps{
																													Type: []string{"string"},
																												}},
																										},
																									},
																								},
																								"name": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"string"},
																									},
																								},
																								"queryBreakdown": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"array"},
																										Items: &spec.SchemaOrArray{
																											Schema: &spec.Schema{
																												SchemaProps: spec.SchemaProps{
																													Type: []string{"object"},
																													Properties: map[string]spec.Schema{
																														"compatibilityScore": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"number"},
																															},
																														},
																														"foundMetrics": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"integer"},
																															},
																														},
																														"missingMetrics": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"array"},
																																Items: &spec.SchemaOrArray{
																																	Schema: &spec.Schema{
																																		SchemaProps: spec.SchemaProps{
																																			Type: []string{"string"},
																																		}},
																																},
																															},
																														},
																														"panelID": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"integer"},
																															},
																														},
																														"panelTitle": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"string"},
																															},
																														},
																														"queryRefId": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"string"},
																															},
																														},
																														"totalMetrics": {
																															SchemaProps: spec.SchemaProps{
																																Type: []string{"integer"},
																															},
																														},
																													},
																													Required: []string{
																														"panelTitle",
																														"panelID",
																														"queryRefId",
																														"totalMetrics",
																														"foundMetrics",
																														"missingMetrics",
																														"compatibilityScore",
																													},
																												}},
																										},
																									},
																								},
																								"totalMetrics": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"integer"},
																									},
																								},
																								"totalQueries": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"integer"},
																									},
																								},
																								"type": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"string"},
																									},
																								},
																								"uid": {
																									SchemaProps: spec.SchemaProps{
																										Type: []string{"string"},
																									},
																								},
																							},
																							Required: []string{
																								"uid",
																								"type",
																								"totalQueries",
																								"checkedQueries",
																								"totalMetrics",
																								"foundMetrics",
																								"missingMetrics",
																								"queryBreakdown",
																								"compatibilityScore",
																							},
																						}},
																				},
																			},
																		},
																		"kind": {
																			SchemaProps: spec.SchemaProps{
																				Type:        []string{"string"},
																				Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
																			},
																		},
																	},
																	Required: []string{
																		"compatibilityScore",
																		"datasourceResults",
																		"apiVersion",
																		"kind",
																	},
																}},
														}},
												},
											},
										},
									}},
							},
						},
					},
				},
				Cluster: map[string]spec3.PathProps{},
				Schemas: map[string]spec.Schema{},
			},
		},
	},
}

func LocalManifest() app.Manifest {
	return app.NewEmbeddedManifest(appManifestData)
}

func RemoteManifest() app.Manifest {
	return app.NewAPIServerManifest("dashvalidator")
}

var kindVersionToGoType = map[string]resource.Kind{}

// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists.
// If there is no association for the provided Kind and Version, exists will return false.
func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) {
	goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
	return goType, exists
}

var customRouteToGoResponseType = map[string]any{
	"v1alpha1||<namespace>/check|POST": v1alpha1.CreateCheckResponse{},
}

// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
// Resource routes (those without a kind) should prefix their route with "<namespace>/" if the route is namespaced (otherwise the route is assumed to be cluster-scope)
func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
	if len(path) > 0 && path[0] == '/' {
		path = path[1:]
	}
	goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
	return goType, exists
}

var customRouteToGoParamsType = map[string]runtime.Object{}

func ManifestCustomRouteQueryAssociator(kind, version, path, verb string) (goType runtime.Object, exists bool) {
	if len(path) > 0 && path[0] == '/' {
		path = path[1:]
	}
	goType, exists = customRouteToGoParamsType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
	return goType, exists
}

var customRouteToGoRequestBodyType = map[string]any{
	"v1alpha1||<namespace>/check|POST": v1alpha1.CreateCheckRequestBody{},
}

func ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb string) (goType any, exists bool) {
	if len(path) > 0 && path[0] == '/' {
		path = path[1:]
	}
	goType, exists = customRouteToGoRequestBodyType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
	return goType, exists
}

type GoTypeAssociator struct{}

func NewGoTypeAssociator() *GoTypeAssociator {
	return &GoTypeAssociator{}
}

func (g *GoTypeAssociator) KindToGoType(kind, version string) (goType resource.Kind, exists bool) {
	return ManifestGoTypeAssociator(kind, version)
}
func (g *GoTypeAssociator) CustomRouteReturnGoType(kind, version, path, verb string) (goType any, exists bool) {
	return ManifestCustomRouteResponsesAssociator(kind, version, path, verb)
}
func (g *GoTypeAssociator) CustomRouteQueryGoType(kind, version, path, verb string) (goType runtime.Object, exists bool) {
	return ManifestCustomRouteQueryAssociator(kind, version, path, verb)
}
func (g *GoTypeAssociator) CustomRouteRequestBodyGoType(kind, version, path, verb string) (goType any, exists bool) {
	return ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb)
}
