package api

import (
	"context"
	"encoding/json"
	"net/http"

	"github.com/go-chi/chi/v5"
	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/perf/go/graphsshortcut"
	"go.skia.org/infra/perf/go/shortcut"
)

// shortcutsApi provides a struct for handling shortcut api endpoints.
type shortcutsApi struct {
	shortcutStore       shortcut.Store
	graphsShortcutStore graphsshortcut.Store
}

// NewShortCutsApi returns a new instance of the shortcutsApi struct.
func NewShortCutsApi(shortcutStore shortcut.Store, graphsShortcutStore graphsshortcut.Store) shortcutsApi {
	return shortcutsApi{
		shortcutStore:       shortcutStore,
		graphsShortcutStore: graphsShortcutStore,
	}
}

// RegisterHandlers registers the api handlers for their respective routes.
func (api shortcutsApi) RegisterHandlers(router *chi.Mux) {
	router.Post("/_/keys", api.keysHandler)
	router.Post("/_/shortcut/get", api.getGraphsShortcutHandler)
	router.Post("/_/shortcut/update", api.createGraphsShortcutHandler)
}

// keysHandler handles the POST requests of a list of keys.
//
//	{
//	   "keys": [
//	        ",arch=x86,...",
//	        ",arch=x86,...",
//	   ]
//	}
//
// And returns the ID of the new shortcut to that list of keys:
//
//	{
//	  "id": 123456,
//	}
func (api shortcutsApi) keysHandler(w http.ResponseWriter, r *http.Request) {
	ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
	defer cancel()
	w.Header().Set("Content-Type", "application/json")

	id, err := api.shortcutStore.Insert(ctx, r.Body)
	if err != nil {
		httputils.ReportError(w, err, "Error inserting shortcut.", http.StatusInternalServerError)
		return
	}
	if err := json.NewEncoder(w).Encode(map[string]string{"id": id}); err != nil {
		sklog.Errorf("Failed to write or encode output: %s", err)
	}
}

type GetGraphsShortcutRequest struct {
	ID string `json:"id"`
}

// getGraphsShortcutHandler returns the graphsShortcut details for the given shortcut id.
func (api shortcutsApi) getGraphsShortcutHandler(w http.ResponseWriter, r *http.Request) {
	ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
	defer cancel()
	w.Header().Set("Content-Type", "application/json")

	var ggsr GetGraphsShortcutRequest
	if err := json.NewDecoder(r.Body).Decode(&ggsr); err != nil {
		httputils.ReportError(w, err, "Failed to decode JSON.", http.StatusInternalServerError)
		return
	}

	sc, err := api.graphsShortcutStore.GetShortcut(ctx, ggsr.ID)

	if err != nil {
		httputils.ReportError(w, err, "Failed to get keys shortcut.", http.StatusInternalServerError)
		return
	}

	if err := json.NewEncoder(w).Encode(sc); err != nil {
		sklog.Errorf("Failed to write or encode output: %s", err)
	}
}

// createGraphsShortcutHandler creates a new graphsShortcut from the supplied information.
func (api shortcutsApi) createGraphsShortcutHandler(w http.ResponseWriter, r *http.Request) {
	ctx, cancel := context.WithTimeout(r.Context(), defaultDatabaseTimeout)
	defer cancel()
	w.Header().Set("Content-Type", "application/json")

	shortcut := &graphsshortcut.GraphsShortcut{}
	if err := json.NewDecoder(r.Body).Decode(shortcut); err != nil {
		httputils.ReportError(w, err, "Unable to read shortcut body.", http.StatusInternalServerError)
		return
	}

	id, err := api.graphsShortcutStore.InsertShortcut(ctx, shortcut)
	if err != nil {
		httputils.ReportError(w, err, "Error inserting graphs shortcut.", http.StatusInternalServerError)
		return
	}
	if err := json.NewEncoder(w).Encode(map[string]string{"id": id}); err != nil {
		sklog.Errorf("Failed to write or encode output: %s", err)
	}
}
