package starlog

import (
	"b612.me/starmap"
	"fmt"
	"io"
	"math/rand"
	"sync"
	"time"
)

var Std *StarLogger
var stdmu sync.Mutex

func init() {
	stacks = starmap.NewStarStack(1024)
	rand.Seed(time.Now().UnixNano())
	stackStopChan = make(chan int)
	StartStacks()
	Std = NewStarlog(nil)
}

func SetShowColor(val bool) {
	Std.SetShowColor(val)
}

func GetShowColor() bool {
	return Std.GetShowColor()
}

func SetLevelColor(level int, color []Attr) {
	Std.SetLevelColor(level, color)
}

func GetLevelColor(level int) []Attr {
	return Std.GetLevelColor(level)
}

func Debug(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Debug(str...)
	Std.isStd = false
}

func Debugf(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Debugf(format, str...)
	Std.isStd = false
}

func Debugln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Debugln(str...)
	Std.isStd = false
}

func Info(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Info(str...)
	Std.isStd = false
}

func Infof(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Infof(format, str...)
	Std.isStd = false
}

func Infoln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Infoln(str...)
	Std.isStd = false
}

func Notice(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Notice(str...)
	Std.isStd = false
}

func Noticef(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Noticef(format, str...)
	Std.isStd = false
}

func Noticeln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Noticeln(str...)
	Std.isStd = false
}

func Warning(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Warning(str...)
	Std.isStd = false
}

func Warningf(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Warningf(format, str...)
	Std.isStd = false
}

func Warningln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Warningln(str...)
	Std.isStd = false
}

func Error(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Error(str...)
	Std.isStd = false
}

func Errorf(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Errorf(format, str...)
	Std.isStd = false
}

func Errorln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Errorln(str...)
	Std.isStd = false
}

func Critical(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Critical(str...)
	Std.isStd = false
}

func Criticalf(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Criticalf(format, str...)
	Std.isStd = false
}

func Criticalln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Criticalln(str...)
	Std.isStd = false
}

func Fatal(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Fatal(str...)
	Std.isStd = false
}

func Fatalf(format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Fatalf(format, str...)
	Std.isStd = false
}

func Panicln(str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Fatalln(str...)
	Std.isStd = false
}

func Print(str ...interface{}) {
	Std.Print(str...)
}

func Printf(format string, str ...interface{}) {
	Std.Printf(format, str...)
}

func Println(str ...interface{}) {
	Std.Println(str...)
}

func Log(isShow bool, level int, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Log(isShow, level, str...)
	Std.isStd = false
}

func Logf(isShow bool, level int, format string, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Logf(isShow, level, format, str...)
	Std.isStd = false
}

func Logln(isShow bool, level int, str ...interface{}) {
	stdmu.Lock()
	defer stdmu.Unlock()
	Std.isStd = true
	Std.Logln(isShow, level, str...)
	Std.isStd = false
}

func StdPrint(attr []Attr, str ...interface{}) {
	strs := fmt.Sprint(str...)
	NewColor(attr...).Fprint(stdScreen, strs)
}

func StdPrintf(attr []Attr, format string, str ...interface{}) {
	strs := fmt.Sprintf(format, str...)
	NewColor(attr...).Fprint(stdScreen, strs)
}

func StdPrintln(attr []Attr, str ...interface{}) {
	strs := fmt.Sprintln(str...)
	NewColor(attr...).Fprint(stdScreen, strs)
}

func SetWriter(wr io.Writer) {
	Std.SetWriter(wr)
}
func GetWriter() io.Writer {
	return Std.GetWriter()
}

func SetHandler(f func([]Attr, string)) {
	Std.SetHandler(f)
}
func GetHandler() func([]Attr, string) {
	return Std.GetHandler()
}
func SetSwitching(sw bool) {
	Std.SetSwitching(sw)
}

func SetShowOriginFile(val bool) {
	Std.SetShowOriginFile(val)
}

func GetShowOriginFile() bool {
	return Std.GetShowOriginFile()
}

func SetShowFuncName(val bool) {
	Std.logcore.showFuncName = val
}

func GetShowFuncName() bool {
	return Std.logcore.showFuncName
}

func SetShowLevel(val bool) {
	Std.SetShowLevel(val)
}

func GetShowLevel() bool {
	return Std.GetShowLevel()
}

func SetShowFlag(val bool) {
	Std.SetShowFlag(val)
}

func GetShowFlag() bool {
	return Std.GetShowFlag()
}

func SetShowStd(val bool) {
	Std.SetShowStd(val)
}

func GetShowStd() bool {
	return Std.GetShowStd()
}

func StopWrite() {
	Std.StopWrite()
}

func EnbaleWrite() {
	Std.EnbaleWrite()
}

func IsWriteStoed() bool {
	return Std.IsWriteStoed()
}
