package gologger

import (
	"os"
	"path/filepath"
)

type FileAppender struct {
	filePath string
	file     *os.File
}

func (f *FileAppender) GetName() string {
	return "FileAppender:" + f.filePath
}

func (f *FileAppender) Append(logEvent LogEvent) {
	if f.file == nil || int(f.file.Fd()) == -1 {
		dirName := filepath.Dir(f.filePath)
		_, err := os.Stat(dirName)
		if err != nil && os.IsNotExist(err) {
			os.MkdirAll(dirName, 0755)
		}
		f.file, _ = os.OpenFile(f.filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	}

	logMsg := format(logEvent)
	f.file.WriteString(logMsg)

}

func makeFileAppender(appenderConfig LogAppenderConfig) LoggerAppender {
	var logfile interface{}
	var ok bool
	logfile, ok = appenderConfig.Options["file"]
	if !ok {
		logfile = "default.log"
	}
	var ret LoggerAppender = &FileAppender{
		filePath: logfile.(string),
	}
	return ret
}

func init() {
	RegistAppender("file", makeFileAppender)
}
