package main

import (
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
)

const testdataSummaryDir = "./testdata/write-throughput/"

var (
	testdataSummaryFile            = filepath.Join(testdataSummaryDir, summaryFilename)
	testdataPerRunSummaryFilenames = []string{
		"20211027-pebble-write-size=1024-run_1-summary.json",
		"20211028-pebble-write-size=1024-run_1-summary.json",
	}
)

func TestParseWrite_FromScratch(t *testing.T) {
	maybeSkip(t)

	testFn := func(t *testing.T, dataDir string) {
		// Set up the output directory for the test.
		testDir := t.TempDir()
		summaryDir := filepath.Join(testDir, "write-throughput")
		err := os.Mkdir(summaryDir, 0700)
		require.NoError(t, err)

		// Write out the new summary file.
		err = parseWrite(dataDir, summaryDir)
		require.NoError(t, err)

		// Confirm new summary.json file matches what we expect.
		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
		require.NoError(t, err)

		// The individual per-run *summary.json files are equal.
		for _, p := range testdataPerRunSummaryFilenames {
			err = filesEqual(filepath.Join(testdataSummaryDir, p), filepath.Join(summaryDir, p))
			require.NoError(t, err)
		}
	}

	for _, dir := range dataDirPaths {
		t.Run(dir, func(t *testing.T) {
			testFn(t, dir)
		})
	}
}

func TestParseWrite_Existing(t *testing.T) {
	maybeSkip(t)

	testFn := func(t *testing.T, dataDir string) {
		// Set up the output directory for the test.
		testDir := t.TempDir()
		summaryDir := filepath.Join(testDir, "write-throughput")
		err := os.Mkdir(summaryDir, 0700)
		require.NoError(t, err)

		// Copy all files into the test dir excluding one day.
		newDataDir := filepath.Join(testDir, "data")
		err = copyDir(dataDir, newDataDir)
		require.NoError(t, err)
		err = os.RemoveAll(filepath.Join(newDataDir, "20211027"))
		require.NoError(t, err)

		// Write out the new summary file.
		err = parseWrite(newDataDir, summaryDir)
		require.NoError(t, err)

		// Confirm new summary.json files are NOT equal.
		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
		require.Error(t, err)

		// The only per-run *summary.json files are for the days we did not remove
		// (i.e. 20211028/**-summary.json)
		var perRunFiles []string
		err = filepath.Walk(summaryDir, func(path string, info os.FileInfo, err error) error {
			basename := filepath.Base(path)
			if strings.HasSuffix(basename, "-summary.json") {
				perRunFiles = append(perRunFiles, basename)
			}
			return nil
		})
		require.NoError(t, err)
		require.Equal(t, perRunFiles, testdataPerRunSummaryFilenames[1:])

		// Re-construct the summary.json file with the full set of data (i.e. the
		// original data directory).
		err = parseWrite(dataDir, summaryDir)
		require.NoError(t, err)

		// Confirm the two summary.json files are now equal.
		err = filesEqual(testdataSummaryFile, filepath.Join(summaryDir, summaryFilename))
		require.NoError(t, err)

		// The individual per-run *summary.json files are equal.
		for _, p := range testdataPerRunSummaryFilenames {
			err = filesEqual(filepath.Join(testdataSummaryDir, p), filepath.Join(summaryDir, p))
			require.NoError(t, err)
		}
	}

	for _, dir := range dataDirPaths {
		t.Run(dir, func(t *testing.T) {
			testFn(t, dir)
		})
	}
}