package util

import (
	"log"
	"strings"

	"golang.org/x/sys/windows"
	"golang.org/x/sys/windows/svc/eventlog"
)

type eventLogWriter struct {
	el *eventlog.Log
}

// Write sends a log message to the Event Log.
func (w *eventLogWriter) Write(b []byte) (int, error) {
	return len(b), w.el.Info(1, string(b))
}

func ConfigureSyslog(serviceName string) error {
	// Note that the eventlog src is the same as the service name
	// Otherwise, we will get "the description for event id cannot be found" warning in every log record

	// Continue if we receive "registry key already exists" or if we get
	// ERROR_ACCESS_DENIED so that we can log without administrative permissions
	// for pre-existing eventlog sources.
	if err := eventlog.InstallAsEventCreate(serviceName, eventlog.Info|eventlog.Warning|eventlog.Error); err != nil {
		if !strings.Contains(err.Error(), "registry key already exists") && err != windows.ERROR_ACCESS_DENIED {
			return err
		}
	}
	el, err := eventlog.Open(serviceName)
	if err != nil {
		return err
	}

	log.SetOutput(&eventLogWriter{el: el})
	return nil
}
