package tools

import (
	_ "embed"
	"encoding/json"
	"fmt"
	"sync"
)

// swaggerJSON is the embedded snapshot of the backend OpenAPI contract.
//
// Source: security-center-backend/docs/swagger.json (swag generated).
// Sync: re-copy that file here after backend API changes, then run
// `go test ./internal/tools/` to verify the registry still matches.
//
//go:embed schemas/swagger.json
var swaggerJSON []byte

// swaggerDoc is the minimal slice of the swagger 2.0 document this
// package validates against: paths → operations → parameters.
type swaggerDoc struct {
	Paths map[string]map[string]swaggerOperation `json:"paths"`
}

type swaggerOperation struct {
	Parameters []swaggerParameter `json:"parameters"`
}

type swaggerParameter struct {
	Name string `json:"name"`
	In   string `json:"in"`   // "query" | "path"
	Type string `json:"type"` // "string" | "integer" | "boolean"
}

// param returns the declared parameter with the given name.
func (op swaggerOperation) param(name string) (swaggerParameter, bool) {
	for _, p := range op.Parameters {
		if p.Name == name {
			return p, true
		}
	}
	return swaggerParameter{}, false
}

var (
	swaggerOnce sync.Once
	swagger     *swaggerDoc
	swaggerErr  error
)

// loadSwagger parses the embedded snapshot exactly once.
func loadSwagger() (*swaggerDoc, error) {
	swaggerOnce.Do(func() {
		var doc swaggerDoc
		if err := json.Unmarshal(swaggerJSON, &doc); err != nil {
			swaggerErr = fmt.Errorf("tools: parse embedded schemas/swagger.json: %w", err)
			return
		}
		swagger = &doc
	})
	return swagger, swaggerErr
}
