package logrus_syslog

import (
	"os"
	"fmt"
	"log/syslog"
	"github.com/Sirupsen/logrus"
)

// SyslogHook to send logs via syslog.
type SyslogHook struct{
	Writer			*syslog.Writer
	SyslogNetwork	string
	SyslogRaddr		string
}

// Creates a hook to be added to an instance of logger. This is called with
// `hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_DEBUG, "")`
// `if err == nil { log.Hooks.Add(hook) }`
func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error) {
	w, err := syslog.Dial(network, raddr, priority, tag)
	return &SyslogHook{w, network, raddr}, err
}

func (hook *SyslogHook) Fire(entry *logrus.Entry) error {
	reader, err := entry.Reader()
	if err != nil {
		fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err)
		return err
	}

	line := reader.String()

	switch entry.Data["level"] {
	case "panic":
		return hook.Writer.Crit(line)
	case "fatal":
		return hook.Writer.Crit(line)
	case "error":
		return hook.Writer.Err(line)
	case "warn":
		return hook.Writer.Warning(line)
	case "info":
		return hook.Writer.Info(line)
	case "debug":
		return hook.Writer.Debug(line)
	default:
		return nil
	}
}

func (hook *SyslogHook) Levels() []logrus.Level {
	return []logrus.Level{
		logrus.Panic,
		logrus.Fatal,
		logrus.Error,
		logrus.Warn,
		logrus.Info,
		logrus.Debug,
	}
}
