package nori

import (
	"bytes"
	"fmt"
	"os"
	"strings"
	"testing"

	"gitlab.com/gfxlabs/gfximg/apng"
)

func TestParseFile1(t *testing.T) {
	rd, err := os.OpenFile("./nori_test/test1.nri", os.O_RDONLY, 0666)
	if err != nil {
		t.Errorf("open file: %s", err)
	}
	nori, err := NewReader(rd).Decode()
	if err != nil {
		t.Errorf("decode: %s", err)
	}
	t.Logf("\n nori: %+v\n gawi: %+v", nori, nori.Gawi)

	err = writeApng(nori, "test1")
	if err != nil {
		t.Errorf("export: %s", err)
	}
}

func TestParseFile2(t *testing.T) {
	rd, err := os.OpenFile("./nori_test/test2.nri", os.O_RDONLY, 0666)
	if err != nil {
		t.Errorf("open file: %s", err)
	}
	nori, err := NewReader(rd).Decode()
	if err != nil {
		t.Errorf("decode: %s", err)
	}
	t.Logf("\n nori: %+v\n gawi: %+v", nori, nori.Gawi)
	err = writeApng(nori, "test2")
	if err != nil {
		t.Errorf("export: %s", err)
	}
}

func TestParsePalette(t *testing.T) {
	rd, err := os.OpenFile("./nori_test/palette.nri", os.O_RDONLY, 0666)
	if err != nil {
		t.Errorf("open file: %s", err)
	}
	nori, err := NewReader(rd).Decode()
	if err != nil {
		t.Errorf("decode: %s", err)
	}
	t.Logf("\n nori: %+v\n gawi: %+v\n palette: %+v\n", nori, nori.Gawi, nori.Gawi.Palette)
	err = writeApng(nori, "palette")
	if err != nil {
		t.Errorf("export: %s", err)
	}
}

func writeApng(nori *Nori, name string) error {
	postfix := ".example"
	out := new(bytes.Buffer)
	os.MkdirAll(fmt.Sprintf("./nori_test/%s%s", name, postfix), 0740)
	for i := range nori.Animations {
		a, err := nori.ExportAnimation(i)
		if err != nil {
			if strings.Contains(err.Error(), "no frame") {
				continue
			}
			return err
		}
		err = apng.Encode(out, *a)
		if err != nil {
			return err
		}
		err = os.WriteFile(fmt.Sprintf("./nori_test/%s%s/animation_%d.apng", name, postfix, i), out.Bytes(), 0740)
		if err != nil {
			return err
		}
		out.Reset()
	}
	return nil
}
