package yqlib

import (
	"io"
	"os"
	"testing"

	"github.com/mikefarah/yq/v4/test"
)

func createTestFile(content string) string {
	tempFile, err := createTempFile()
	if err != nil {
		panic(err)
	}

	_, err = tempFile.Write([]byte(content))
	if err != nil {
		panic(err)
	}

	safelyCloseFile(tempFile)

	return tempFile.Name()
}

func readFile(filename string) string {
	bytes, err := os.ReadFile(filename)
	if err != nil {
		panic(err)
	}
	return string(bytes)
}

func TestFrontMatterSplitWithLeadingSep(t *testing.T) {
	file := createTestFile(`---
a: apple
b: banana
---
not a 
yaml: doc
`)

	expectedYamlFm := `---
a: apple
b: banana
`

	expectedContent := `---
not a 
yaml: doc
`

	fmHandler := NewFrontMatterHandler(file)
	err := fmHandler.Split()
	if err != nil {
		panic(err)
	}

	yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())

	test.AssertResult(t, expectedYamlFm, yamlFm)

	contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
	if err != nil {
		panic(err)
	}
	test.AssertResult(t, expectedContent, string(contentBytes))

	tryRemoveTempFile(file)
	fmHandler.CleanUp()
}

func TestFrontMatterSplitWithNoLeadingSep(t *testing.T) {
	file := createTestFile(`a: apple
b: banana
---
not a 
yaml: doc
`)

	expectedYamlFm := `a: apple
b: banana
`

	expectedContent := `---
not a 
yaml: doc
`

	fmHandler := NewFrontMatterHandler(file)
	err := fmHandler.Split()
	if err != nil {
		panic(err)
	}

	yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())

	test.AssertResult(t, expectedYamlFm, yamlFm)

	contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
	if err != nil {
		panic(err)
	}
	test.AssertResult(t, expectedContent, string(contentBytes))

	tryRemoveTempFile(file)
	fmHandler.CleanUp()
}

func TestFrontMatterSplitWithArray(t *testing.T) {
	file := createTestFile(`[1,2,3]
---
not a 
yaml: doc
`)

	expectedYamlFm := "[1,2,3]\n"

	expectedContent := `---
not a 
yaml: doc
`

	fmHandler := NewFrontMatterHandler(file)
	err := fmHandler.Split()
	if err != nil {
		panic(err)
	}

	yamlFm := readFile(fmHandler.GetYamlFrontMatterFilename())

	test.AssertResult(t, expectedYamlFm, yamlFm)

	contentBytes, err := io.ReadAll(fmHandler.GetContentReader())
	if err != nil {
		panic(err)
	}
	test.AssertResult(t, expectedContent, string(contentBytes))

	tryRemoveTempFile(file)
	fmHandler.CleanUp()
}
