package slog_file

import (
	"os"
	"testing"
	"time"

	"wartank/pkg/mock/mock_env"
	"wartank/pkg/mock/mockkernel"
	"wartank/pkg/types"
)

/*
	Тест для интерфейса логгера в файл
*/

type tester struct {
	t    *testing.T
	err  error
	me   *mock_env.МокОкружение
	kern types.ИЯдро
	сам  *СлогФайл
}

func TestSlogFile(t *testing.T) {
	_ = os.RemoveAll("./log")
	test := &tester{
		t:  t,
		me: mock_env.НовМокОкружение(),
	}
	test.create()
	test.write()
	test.close()
	test.writeBad1()
	test.cancel()
	_ = os.RemoveAll("./log")
}

// файл уже закрыт
func (сам *tester) writeBad1() {
	if err := сам.сам.write([]byte{}); err == nil {
		сам.t.Errorf("write(): err==nil")
	}
}

// закрытие логгера
func (сам *tester) close() {
	сам.t.Logf("=close=")
	сам.kern.Отменить()
	сам.kern.Wg().Wait()
	сам.сам.Write("")
}

// отмена работы
func (сам *tester) cancel() {
	сам.t.Logf("=cancal=")
	сам.createGood1()
	сам.kern.Отменить()
	сам.kern.Wg().Wait()
}

// запись сообщения
func (сам *tester) write() {
	сам.t.Logf("=write=")
	сам.сам.Write("test msg")
	time.Sleep(time.Millisecond * 150)
}

// Создание файлового логгера
func (сам *tester) create() {
	сам.t.Logf("=create=")
	сам.createBad1()
	сам.createBad2()
	сам.createGood1()
}

func (сам *tester) createGood1() {
	сам.t.Logf("=createGood1=")
	сам.сам, сам.err = НовСлогФайл(сам.kern, "test")
	if сам.err != nil {
		сам.t.Errorf("createGood1(): err=%v", сам.err)
	}
	if сам.сам == nil {
		сам.t.Errorf("createGood1(): SlogFile == nil")
	}
}

// Нет верси сборки
func (сам *tester) createBad2() {
	сам.t.Logf("=createBad2=")
	сам.kern = mockkernel.NewMockKernel()
	сам.сам, сам.err = НовСлогФайл(сам.kern, "")
	if сам.err == nil {
		сам.t.Errorf("createBad2(): err == nil")
	}
	if сам.сам != nil {
		сам.t.Errorf("createBad2(): SlogFile != nil")
	}
}

// Нет объекта ядра
func (сам *tester) createBad1() {
	сам.t.Logf("=createBad1=")
	сам.сам, сам.err = НовСлогФайл(nil, "test")
	if сам.err == nil {
		сам.t.Errorf("createBad1(): err == nil")
	}
	if сам.сам != nil {
		сам.t.Errorf("createBad1(): SlogFile != nil")
	}
}
