package main

import (
	"net/http"
	"strings"
	"time"

	"github.com/bugsnag/bugsnag-go"
	"github.com/getsentry/sentry-go"
	"github.com/honeybadger-io/honeybadger-go"
)

var (
	bugsnagEnabled     bool
	honeybadgerEnabled bool
	sentryEnabled      bool

	headersReplacer = strings.NewReplacer("-", "_")
	sentryTimeout   = 5 * time.Second
)

func initErrorsReporting() {
	if len(conf.BugsnagKey) > 0 {
		bugsnag.Configure(bugsnag.Configuration{
			APIKey:       conf.BugsnagKey,
			ReleaseStage: conf.BugsnagStage,
		})
		bugsnagEnabled = true
	}

	if len(conf.HoneybadgerKey) > 0 {
		honeybadger.Configure(honeybadger.Configuration{
			APIKey: conf.HoneybadgerKey,
			Env:    conf.HoneybadgerEnv,
		})
		honeybadgerEnabled = true
	}

	if len(conf.SentryDSN) > 0 {
		sentry.Init(sentry.ClientOptions{
			Dsn:         conf.SentryDSN,
			Release:     conf.SentryRelease,
			Environment: conf.SentryEnvironment,
		})

		sentryEnabled = true
	}
}

func reportError(err error, req *http.Request) {
	if bugsnagEnabled {
		bugsnag.Notify(err, req)
	}

	if honeybadgerEnabled {
		headers := make(honeybadger.CGIData)

		for k, v := range req.Header {
			key := "HTTP_" + headersReplacer.Replace(strings.ToUpper(k))
			headers[key] = v[0]
		}

		honeybadger.Notify(err, req.URL, headers)
	}

	if sentryEnabled {
		hub := sentry.CurrentHub().Clone()
		hub.Scope().SetRequest(sentry.Request{}.FromHTTPRequest(req))
		hub.Scope().SetLevel(sentry.LevelError)
		eventID := hub.CaptureException(err)
		if eventID != nil {
			hub.Flush(sentryTimeout)
		}
	}
}