package web

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

	"github.com/sirupsen/logrus"
)

type GenericPos struct {
	X float64 `json:"x"`
	Y float64 `json:"y"`
	Z float64 `json:"z"`
}

type Wagon struct {
	Id         string  `json:"id"`
	PosInTrain float64 `json:"pos_in_train"`
	Type       string  `json:"type"`
}

type Signal struct {
	Pos   GenericPos `json:"pos"`
	Green bool       `json:"green"`
}

type Train struct {
	Pos         GenericPos `json:"pos"`
	Id          string     `json:"id"`
	Wagons      []*Wagon   `json:"wagons"`
	OffTrack    bool       `json:"off_track"`
	Velocity    float64    `json:"velocity"`
	Line        string     `json:"line"`
	TextOutside string     `json:"text_outside"`
	TextInside  string     `json:"text_inside"`
}

type Minecart struct {
	Pos   GenericPos `json:"pos"`
	Speed GenericPos `json:"speed"`
	Id    float64    `json:"id"`
}

type Player struct {
	Pos             GenericPos `json:"pos"`
	Velocity        GenericPos `json:"velocity"`
	Name            string     `json:"name"`
	HP              float64    `json:"hp"`
	Breath          float64    `json:"breath"`
	Moderator       bool       `json:"moderator"`
	RTT             float64    `json:"rtt"`
	ProtocolVersion float64    `json:"protocol_version"`
	//TODO: stamina, skin, etc
}

type MinetestInfo struct {
	MaxLag    float64     `json:"max_lag"`
	Players   []*Player   `json:"players"`
	Trains    []*Train    `json:"trains"`
	Signals   []*Signal   `json:"signals"`
	Minecarts []*Minecart `json:"minecarts"`
	Time      float64     `json:"time"`
	Uptime    float64     `json:"uptime"`
}

var LastStats *MinetestInfo

func (api *Api) PostMinetestData(resp http.ResponseWriter, req *http.Request) {
	if req.Header.Get("Authorization") != api.Context.Config.WebApi.SecretKey {
		resp.WriteHeader(403)
		resp.Write([]byte("invalid key!"))
		return
	}

	resp.Header().Add("content-type", "application/json")
	data := &MinetestInfo{}

	err := json.NewDecoder(req.Body).Decode(data)

	if err != nil {
		resp.WriteHeader(500)
		resp.Write([]byte(err.Error()))
		log.WithFields(logrus.Fields{"error": err}).Error("Json unmarshal")

		return
	}

	mintestPlayers.Set(float64(len(data.Players)))
	mintestMaxLag.Set(data.MaxLag)

	LastStats = data
	api.Context.WebEventbus.Emit("minetest-info", data)

	json.NewEncoder(resp).Encode("stub")
}