package mapblockrenderer

import (
	"fmt"
	"io/ioutil"
	"mapserver/coords"
	"mapserver/db/sqlite"
	"mapserver/mapblockaccessor"
	"mapserver/testutils"
	"mapserver/types"
	"os"
	"testing"
	"time"

	"github.com/minetest-go/colormapping"

	"github.com/sirupsen/logrus"
)

func TestSimpleRender(t *testing.T) {
	logrus.SetLevel(logrus.InfoLevel)

	layers := []*types.Layer{
		{
			Id:   0,
			Name: "Base",
			From: -16,
			To:   160,
		},
	}

	tmpfile, err := ioutil.TempFile("", "TestMigrate.*.sqlite")
	if err != nil {
		panic(err)
	}
	defer os.Remove(tmpfile.Name())
	testutils.CreateTestDatabase(tmpfile.Name())

	a, err := sqlite.New(tmpfile.Name())
	if err != nil {
		panic(err)
	}

	err = a.Migrate()
	if err != nil {
		panic(err)
	}

	cache := mapblockaccessor.NewMapBlockAccessor(a, 500*time.Millisecond, 1000*time.Millisecond, 1000)
	c := colormapping.NewColorMapping()
	err = c.LoadDefaults()
	if err != nil {
		t.Fatal(err)
	}

	r := NewMapBlockRenderer(cache, c)
	os.Mkdir("../test-output", 0755)

	results := make(chan JobResult, 100)
	jobs := make(chan JobData, 100)

	go Worker(r, jobs, results)
	go Worker(r, jobs, results)
	go Worker(r, jobs, results)

	go func() {
		for result := range results {
			if result.Data.Len() == 0 {
				continue
			}

			tc := coords.GetTileCoordsFromMapBlock(result.Job.Pos1, layers)
			f, _ := os.Create(fmt.Sprintf("../test-output/image_%d_%d.png", tc.X, tc.Y))
			result.Data.WriteTo(f)
			f.Close()
		}
	}()

	from := -10
	to := 10

	for x := from; x < to; x++ {
		for z := from; z < to; z++ {
			pos1 := types.NewMapBlockCoords(x, 10, z)
			pos2 := types.NewMapBlockCoords(x, -1, z)

			jobs <- JobData{Pos1: pos1, Pos2: pos2}
		}
	}

	close(jobs)

}