package areasparser

import (
	"io/ioutil"
	"mapserver/luaparser"
)

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 ParseFile(filename string) ([]*Area, error) {
	content, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}

	return Parse(content)
}

func Parse(data []byte) ([]*Area, error) {
	p := luaparser.New()
	areas := make([]*Area, 0)

	list, err := p.ParseList(string(data[:]))

	if err != nil {
		return nil, err
	}

	for _, entry := range list {
		a := Area{}
		a.Name = entry["name"].(string)
		a.Owner = entry["owner"].(string)
		if entry["parent"] != nil {
			a.Parent = entry["parent"].(int)
		}

		p1 := GenericPos{}
		pos1 := entry["pos1"].(map[string]interface{})
		p1.X = pos1["x"].(int)
		p1.Y = pos1["y"].(int)
		p1.Z = pos1["z"].(int)
		a.Pos1 = &p1

		p2 := GenericPos{}
		pos2 := entry["pos2"].(map[string]interface{})
		p2.X = pos2["x"].(int)
		p2.Y = pos2["y"].(int)
		p2.Z = pos2["z"].(int)
		a.Pos2 = &p2

		areas = append(areas, &a)
	}

	return areas, nil
}
