package api

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"

	"github.com/gorilla/mux"
)

func (h APIHandler) GetCache(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	cacheid := vars["cacheid"]
	// Use a channel to synchronize the goroutines
	ch := make(chan []byte)
	// Fetch data from cache asynchronously
	go func() {
		d, err := h.cache.Get(cacheid)
		if err != nil {
			fmt.Println(err)
			w.WriteHeader(http.StatusNotFound)
			ch <- nil
			return
		}
		var data []any
		if val, ok := d.([]any); ok {
			data = val
		} else {
			data = []any{d}
		}
		j := toJSON(data, w, r)
		ch <- j // Signal that the data has been fetched successfully
		close(ch)
	}()
	// wait for the JSON marshaling goroutine to finish
	j := <-ch
	if j == nil {
		return // Stop processing if an error occurred
	}
	// Send the JSON response to the client
	w.WriteHeader(http.StatusOK)
	w.Header().Set("Content-Type", "application/json")
	w.Write(j)

	<-ch
}
func toJSON(data []any, w http.ResponseWriter, r *http.Request) []byte {
	result := data
	if limitsmin, ok := r.URL.Query()["limits.min"]; ok {
		min, _ := strconv.Atoi(limitsmin[0])
		if limitsmax, ok := r.URL.Query()["limits.max"]; ok {
			max, _ := strconv.Atoi(limitsmax[0])
			if max > len(data) {
				result = data[min:]
			} else {
				result = data[min:max]
			}
		} else {
			result = data[min:]
		}
	}
	j, err := json.Marshal(result)
	if err != nil {
		w.WriteHeader(http.StatusNotFound)
		return nil
	}
	return j
}
