package internal

import (
	"os"
	"path"
	"strings"

	"github.com/ncruces/zenity"
)

var showError = true

type AppLogger struct {
	directory string
	filename  string
	filepath  string
}

func NewAppLogger(directory, filename string) *AppLogger {
	return &AppLogger{
		directory: directory,
		filename:  filename,
		filepath:  path.Join(directory, filename),
	}
}

func (l *AppLogger) Print(message string) {
	os.MkdirAll(l.directory, os.ModePerm)
	f, err := os.OpenFile(l.filepath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)

	if err != nil && showError {
		zenity.Error(err.Error(), zenity.Title("Could not open logfile!"), zenity.ErrorIcon)
		showError = false
	}

	if _, err = f.WriteString(message); err != nil {
		if showError {
			zenity.Error(err.Error(), zenity.Title("Could not write to logfile!"), zenity.ErrorIcon)
			showError = false
		} else {
			showError = true
		}
	} else {
		showError = true
	}

	f.Close()
}

func (l *AppLogger) Println(message string) {
	l.Print(message + "\n")
}

func (l *AppLogger) Trace(message string) {
	l.Println("TRACE | " + message)
}

func (l *AppLogger) Debug(message string) {
	if strings.HasPrefix(message, "[ExternalAssetHandler]") {
		return
	}
	l.Println("DEBUG | " + message)
}

func (l *AppLogger) Info(message string) {
	l.Println("INFO  | " + message)
}

func (l *AppLogger) Warning(message string) {
	l.Println("WARN  | " + message)
}

func (l *AppLogger) Error(message string) {
	l.Println("ERROR | " + message)
}

func (l *AppLogger) Fatal(message string) {
	l.Println("FATAL | " + message)
	os.Exit(1)
}