package areasparser

import (
	"bytes"
	"encoding/json"
	"os"
)

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

type Area struct {
	Owner  string      `json:"owner"`
	Name   string      `json:"name"`
	Parent int         `json:"parent"`
	Pos1   *GenericPos `json:"pos1"`
	Pos2   *GenericPos `json:"pos2"`
}

func getInt(o interface{}) int {
	v, _ := o.(float64)
	return int(v)
}

func (pos *GenericPos) UnmarshalJSON(data []byte) error {
	m := make(map[string]interface{})
	err := json.Unmarshal(data, &m)
	if err != nil {
		return err
	}

	// float-like to int workaround
	pos.X = getInt(m["x"])
	pos.Y = getInt(m["y"])
	pos.Z = getInt(m["z"])

	return nil
}

func ParseFile(filename string) ([]*Area, error) {
	content, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}

	return Parse(content)
}

func Parse(data []byte) ([]*Area, error) {
	areas := make([]*Area, 0)
	json.NewDecoder(bytes.NewReader(data)).Decode(&areas)

	return areas, nil
}
