package main

import (
	"io"
	"log"

	c "github.com/fatih/color"
)

type Logger interface {
	Printf(format string, v ...interface{})
	Print(v ...interface{})
	Println(v ...interface{})
	Fatal(v ...interface{})
	Fatalf(format string, v ...interface{})
}

type logger struct {
	logger  *log.Logger
	printer *c.Color
}

func NewLogger(out io.Writer, prefix string, flag int, color c.Attribute) (l logger) {
	l.logger = log.New(out, prefix, flag)
	l.printer = c.New(color)
	return l
}

func (l logger) Printf(format string, v ...interface{}) {
	l.logger.Print(l.printer.Sprintf(format, v...))
}
func (l logger) Print(v ...interface{})   { l.logger.Print(l.printer.Sprint(v...)) }
func (l logger) Println(v ...interface{}) { l.logger.Print(l.printer.Sprintln(v...)) }
func (l logger) Fatal(v ...interface{})   { l.logger.Fatal(l.printer.Sprint(v...)) }
func (l logger) Fatalf(format string, v ...interface{}) {
	l.logger.Fatal(l.printer.Sprintf(format, v...))
}

type emptyLogger bool

func (l emptyLogger) Printf(format string, v ...interface{}) {}
func (l emptyLogger) Print(v ...interface{})                 {}
func (l emptyLogger) Println(v ...interface{})               {}
func (l emptyLogger) Fatal(v ...interface{})                 {}
func (l emptyLogger) Fatalf(format string, v ...interface{}) {}