package logging

import (
	"fmt"
	"log"
	"os"
	"time"
)

var (
	filePath     string
	file         *os.File
	history      []string
	debugEnabled bool
	logger       = log.New(os.Stderr, "[videotools] ", log.LstdFlags|log.Lmicroseconds)
)

const historyMax = 500

// Category represents a log category
type Category string

const (
	CatUI     Category = "[UI]"
	CatCLI    Category = "[CLI]"
	CatFFMPEG Category = "[FFMPEG]"
	CatSystem Category = "[SYS]"
	CatModule Category = "[MODULE]"
)

// Init initializes the logging system
func Init() {
	filePath = os.Getenv("VIDEOTOOLS_LOG_FILE")
	if filePath == "" {
		filePath = "videotools.log"
	}
	f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644)
	if err != nil {
		fmt.Fprintf(os.Stderr, "videotools: cannot open log file %s: %v\n", filePath, err)
		return
	}
	file = f
}

// Close closes the log file
func Close() {
	if file != nil {
		file.Close()
	}
}

// SetDebug enables or disables debug logging
func SetDebug(on bool) {
	debugEnabled = on
	Debug(CatSystem, "debug logging toggled -> %v (VIDEOTOOLS_DEBUG=%s)", on, os.Getenv("VIDEOTOOLS_DEBUG"))
}

// Debug logs a debug message with a category
func Debug(cat Category, format string, args ...interface{}) {
	msg := fmt.Sprintf("%s %s", cat, fmt.Sprintf(format, args...))
	timestamp := time.Now().Format(time.RFC3339Nano)
	if file != nil {
		fmt.Fprintf(file, "%s %s\n", timestamp, msg)
	}
	history = append(history, fmt.Sprintf("%s %s", timestamp, msg))
	if len(history) > historyMax {
		history = history[len(history)-historyMax:]
	}
	if debugEnabled {
		logger.Printf("%s %s", timestamp, msg)
	}
}

// FilePath returns the current log file path
func FilePath() string {
	return filePath
}

// History returns the log history
func History() []string {
	return history
}
