package log

import (
	"bytes"
	"io/ioutil"
	"os"
	"testing"

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

func TestSyncAllLogs(t *testing.T) {
	tempDir, err := ioutil.TempDir("", "*")
	if err != nil {
		t.Fatal(err)
	}
	defer func() {
		if err := os.RemoveAll(tempDir); err != nil {
			t.Fatal(err)
		}
	}()

	cfg := Config{
		EventLogFile: tempDir + "/event.log",
		AppLogFile:   tempDir + "/app.log",
		SentryDSN:    "",
	}

	t.Run("should succeed in prod mode", func(t *testing.T) {
		logCfg := &LoggersConfig{
			&FileLogger{Filename: cfg.EventLogFile},
			&FileLogger{Filename: cfg.AppLogFile},
			"",
		}
		err := InitLogger(logCfg)

		assert.Nil(t, err)

		assert.NotPanics(t, func() {
			SyncAllLogs()
		})

		ResetLogger()
	})

	t.Run("should succeed in debug mode", func(t *testing.T) {
		err := InitLogger(&LoggersConfig{})

		assert.Nil(t, err)

		assert.NotPanics(t, func() {
			SyncAllLogs()
		})

		ResetLogger()
	})

	t.Run("should succeed in test mode", func(t *testing.T) {
		buf := new(bytes.Buffer)
		err := InitLogger(&LoggersConfig{
			EventLogWriter: buf,
			AppLogWriter:   buf,
		})
		if err != nil {
			t.Fatal(err)
		}

		assert.NotPanics(t, func() {
			SyncAllLogs()
		})

		ResetLogger()
	})
}

func TestReopenAllLoggers(t *testing.T) {
	t.Run("should ignore if no log file open", func(t *testing.T) {
		ReopenAllLoggers()
	})

	t.Run("should reopen file", func(t *testing.T) {
		tmpFile, err := ioutil.TempFile("", "*")
		if err != nil {
			t.Fatal(err)
		}
		fl := FileLogger{
			Filename: tmpFile.Name(),
		}
		fileLoggers = FileLoggers{&fl}

		_, err = fl.Write([]byte("hi"))
		if err != nil {
			t.Fatal(err)
		}
		assert.NotNil(t, fl.file, "file loggers should be open")

		ReopenAllLoggers()
		assert.Nil(t, fl.file, "file loggers should be close")
	})
}
