package notifiers

import (
	"github.com/prometheus/common/log"
	"github.com/statping/statping/types/failures"
	"github.com/statping/statping/types/null"
	"github.com/statping/statping/types/services"
	"github.com/statping/statping/utils"
	"time"
)

func InitNotifiers() {
	Add(
		slacker,
		Command,
		Discorder,
		email,
		LineNotify,
		Telegram,
		Twilio,
		Webhook,
		Mobile,
		Pushover,
	)
}

func Add(notifs ...services.ServiceNotifier) {
	for _, n := range notifs {
		services.AddNotifier(n)
		if err := n.Select().Create(); err != nil {
			log.Error(err)
		}
	}
}

func ToMap(srv *services.Service, f *failures.Failure) map[string]interface{} {
	m := make(map[string]interface{})
	m["Service"] = srv
	m["Failure"] = f
	return m
}

func ReplaceVars(input string, s *services.Service, f *failures.Failure) string {
	input = utils.ReplaceTemplate(input, s)
	if f != nil {
		input = utils.ReplaceTemplate(input, f)
	}
	return input
}

var exampleService = &services.Service{
	Id:                  1,
	Name:                "Statping",
	Domain:              "https://statping.com",
	Expected:            null.NewNullString("a better response"),
	ExpectedStatus:      200,
	Interval:            60,
	Type:                "http",
	Method:              "get",
	Timeout:             10,
	Order:               2,
	VerifySSL:           null.NewNullBool(true),
	Public:              null.NewNullBool(true),
	GroupId:             0,
	Permalink:           null.NewNullString("statping"),
	Online:              true,
	Latency:             324399,
	PingTime:            18399,
	Online24Hours:       99.2,
	Online7Days:         99.8,
	AvgResponse:         300233,
	FailuresLast24Hours: 4,
	Checkpoint:          utils.Now().Add(-10 * time.Minute),
	SleepDuration:       55,
	LastResponse:        "returning from a response",
	AllowNotifications:  null.NewNullBool(true),
	UserNotified:        false,
	UpdateNotify:        null.NewNullBool(true),
	SuccessNotified:     false,
	LastStatusCode:      200,
	LastLookupTime:      5233,
	LastLatency:         270233,
	LastCheck:           utils.Now().Add(-15 * time.Second),
	LastOnline:          utils.Now().Add(-15 * time.Second),
	LastOffline:         utils.Now().Add(-10 * time.Minute),
	SecondsOnline:       4500,
	SecondsOffline:      300,
}

var exampleFailure = &failures.Failure{
	Id:        1,
	Issue:     "HTTP returned a 500 status code",
	ErrorCode: 500,
	Service:   1,
	PingTime:  43203,
	CreatedAt: utils.Now().Add(-10 * time.Minute),
}