// package web_log -- веб-лог компонента
package web_log

import (
	"fmt"
	"strings"
	"sync"
	"time"
	"wartank/pkg/types"
)

// ВебЛог -- веб-лог компонента
type ВебЛог struct {
	лог     []string // Буфер логирования
	еслиПеч bool
	блок    sync.RWMutex
}

// НовВебЛог -- возвращает новый *ВебЛог
func НовВебЛог(еслиПеч bool) types.ИВебЛог {
	сам := &ВебЛог{
		лог:     []string{},
		еслиПеч: еслиПеч,
	}
	_ = types.ИВебЛог(сам)
	return сам
}

// ОтклВывод -- отключает вывод в консоль
func (сам *ВебЛог) ОтклВывод() {
	сам.блок.Lock()
	defer сам.блок.Unlock()
	сам.еслиПеч = false
}

// Добавить -- добавляет строку в лог
func (сам *ВебЛог) Добавить(сбщ string, арг ...interface{}) {
	сам.блок.Lock()
	defer сам.блок.Unlock()
	время := time.Now().Local().Format("2006-01-02 15:04:05.000 ")
	сбщ = время + fmt.Sprintf(сбщ, арг...)
	if сам.еслиПеч {
		fmt.Print(сбщ)
	}
	сам.лог = append(сам.лог, сбщ)
	if len(сам.лог) > 50 {
		сам.лог = сам.лог[50:]
	}
}

// Ошибка -- лог ошибок
func (сам *ВебЛог) Ошибка() string {
	сам.блок.RLock()
	defer сам.блок.RUnlock()
	return strings.Join(сам.лог, "\n")
}

// Внимание -- лог предупреждений
func (сам *ВебЛог) Внимание() string {
	сам.блок.RLock()
	defer сам.блок.RUnlock()
	return strings.Join(сам.лог, "\n")
}

// Инфо -- информационный лог
func (сам *ВебЛог) Инфо() string {
	сам.блок.RLock()
	defer сам.блок.RUnlock()
	return strings.Join(сам.лог, "\n")
}

// Отладка -- возвращает весь лог компонента
func (сам *ВебЛог) Отладка() string {
	сам.блок.RLock()
	defer сам.блок.RUnlock()
	return strings.Join(сам.лог, "\n")
}
