package anaconda

import (
	"log"
	"os"
)

// The Logger interface provides optional logging ability for the streaming API.
// It can also be used to log the rate limiting headers if desired.
type Logger interface {
	Fatal(args ...interface{})
	Fatalf(format string, args ...interface{})

	Panic(args ...interface{})
	Panicf(format string, args ...interface{})

	// Log functions
	Critical(args ...interface{})
	Criticalf(format string, args ...interface{})

	Error(args ...interface{})
	Errorf(format string, args ...interface{})

	Warning(args ...interface{})
	Warningf(format string, args ...interface{})

	Notice(args ...interface{})
	Noticef(format string, args ...interface{})

	Info(args ...interface{})
	Infof(format string, args ...interface{})

	Debug(args ...interface{})
	Debugf(format string, args ...interface{})
}

// SetLogger sets the Logger used by the API client.
// The default logger is silent. BasicLogger will log to STDERR
// using the log package from the standard library.
func (c *TwitterApi) SetLogger(l Logger) {
	c.Log = l
}

type silentLogger struct {
}

func (_ silentLogger) Fatal(_ ...interface{})                 {}
func (_ silentLogger) Fatalf(_ string, _ ...interface{})      {}
func (_ silentLogger) Panic(_ ...interface{})                 {}
func (_ silentLogger) Panicf(_ string, _ ...interface{})      {}
func (_ silentLogger) Critical(_ ...interface{})              {}
func (_ silentLogger) Criticalf(_ string, _ ...interface{})   {}
func (_ silentLogger) Error(_ ...interface{})                 {}
func (_ silentLogger) Errorf(_ string, _ ...interface{})      {}
func (_ silentLogger) Warning(_ ...interface{})               {}
func (_ silentLogger) Warningf(_ string, _ ...interface{})    {}
func (_ silentLogger) Notice(_ ...interface{})                {}
func (_ silentLogger) Noticef(_ string, _ ...interface{})     {}
func (_ silentLogger) Info(_ ...interface{})                  {}
func (_ silentLogger) Infof(_ string, _ ...interface{})       {}
func (_ silentLogger) Debug(_ ...interface{})                 {}
func (_ silentLogger) Debugf(format string, _ ...interface{}) {}

// BasicLogger is the equivalent of using log from the standard
// library to print to STDERR.
var BasicLogger Logger

type basicLogger struct {
	log *log.Logger //func New(out io.Writer, prefix string, flag int) *Logger
}

func init() {
	BasicLogger = &basicLogger{log: log.New(os.Stderr, log.Prefix(), log.LstdFlags)}
}

func (l basicLogger) Fatal(items ...interface{})               { l.log.Fatal(items...) }
func (l basicLogger) Fatalf(s string, items ...interface{})    { l.log.Fatalf(s, items...) }
func (l basicLogger) Panic(items ...interface{})               { l.log.Panic(items...) }
func (l basicLogger) Panicf(s string, items ...interface{})    { l.log.Panicf(s, items...) }
func (l basicLogger) Critical(items ...interface{})            { l.log.Print(items...) }
func (l basicLogger) Criticalf(s string, items ...interface{}) { l.log.Printf(s, items...) }
func (l basicLogger) Error(items ...interface{})               { l.log.Print(items...) }
func (l basicLogger) Errorf(s string, items ...interface{})    { l.log.Printf(s, items...) }
func (l basicLogger) Warning(items ...interface{})             { l.log.Print(items...) }
func (l basicLogger) Warningf(s string, items ...interface{})  { l.log.Printf(s, items...) }
func (l basicLogger) Notice(items ...interface{})              { l.log.Print(items...) }
func (l basicLogger) Noticef(s string, items ...interface{})   { l.log.Printf(s, items...) }
func (l basicLogger) Info(items ...interface{})                { l.log.Print(items...) }
func (l basicLogger) Infof(s string, items ...interface{})     { l.log.Printf(s, items...) }
func (l basicLogger) Debug(items ...interface{})               { l.log.Print(items...) }
func (l basicLogger) Debugf(s string, items ...interface{})    { l.log.Printf(s, items...) }
