// Controller for minecraft mod CC:Tweaked
// I decided to make it so I and my friend can create some bizzare stuff in minectaft :D
// It turned out pretty well and was the first controller which I tested.

package controllers

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"

	"github.com/kaptinlin/jsonrepair"
)

// Json unmarshalled object from website.
type Message struct {
	Content  string `json:"content"`
	Msg_type int    `json:"msg_type"`
}

var message_queue = []Message{}

func preprocess_message(r *http.Request) []byte {
	message_bytes, _ := io.ReadAll(r.Body)
	message_body := string(message_bytes)

	repaired, err := jsonrepair.JSONRepair(message_body)
	if err != nil {
		log.Printf("Failed to fix JSON: %v", err)
	}
	repaired_bytes := []byte(repaired)

	return repaired_bytes
}

func decodeMessage(r *http.Request) (Message, error) {
	var messageRC Message

	processed_message := preprocess_message(r)

	err := json.Unmarshal(processed_message, &messageRC)
	if err != nil {
		log.Println(err)
		return Message{}, err
	}
	return messageRC, nil
}

// Garbage collection for messages.
func clearQueue() {
	if len(message_queue) <= 1 {
		return
	}
	message_queue = message_queue[1:]
}

func PostSendMessage(w http.ResponseWriter, r *http.Request) {

	decoded_message, err := decodeMessage(r)
	if err != nil {
		w.WriteHeader(400)
		fmt.Fprintf(w, "Failed to decode message %v", err)
		log.Printf("Failed to decode message %v", err)
		return
	}
	message_queue = append(message_queue, decoded_message)

	clearQueue()

}

func GetMessage(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("content-type", "application/json")
	if len(message_queue) == 0 {
		message_queue = append(message_queue, Message{"no message accepted yet", 404})
	}
	fmt.Fprintln(w, message_queue[0])
}