package cron

import (
	"fmt"
	"strings"

	"gitlab.com/uafrica/go-utils/errors"
	"gitlab.com/uafrica/go-utils/logger"
)

type Router struct {
	endpoints map[string]func(Context) error
}

func (r Router) Endpoints() map[string]func(Context) error {
	return r.endpoints
}

func (r Router) Route(arn string) (string, func(Context) error) {
	for name, hdlr := range r.endpoints {
		if strings.Contains(arn, name) {
			return name, hdlr
		} else {
			logger.Debugf("ARN(%s) does not contain cronName(%s)", arn, name)
		}
	}
	return "", nil
}

//check that all endpoints are correctly defined using one of the supported handler types
//return updated endpoints with additional information
func NewRouter(endpoints map[string]func(Context) error) (Router, error) {
	countLegacyEvent := 0
	countLegacyMessage := 0
	countHandler := 0
	for messageType, handlerFunc := range endpoints {
		if messageType == "" {
			return Router{}, errors.Errorf("blank messageType")
		}
		if messageType == "/sqs-docs" {
			return Router{}, errors.Errorf("%s may not be a defined endpoint - it is reserved", messageType)
		}
		if handlerFunc == nil {
			return Router{}, errors.Errorf("nil handler on %s", messageType)
		}
		fmt.Printf("%30.30s: OK\n", messageType)
	}
	fmt.Printf("Checked %d legacy event and %d legacy message and %d new handlers\n", countLegacyEvent, countLegacyMessage, countHandler)

	//add reserved endpoint to generate documentation
	r := Router{
		endpoints: endpoints,
	}

	// {
	// 	docsHandler, err := NewHandler(GETApiDocs(r)) //endpoints))
	// 	if err != nil {
	// 		return Router{}, errors.Wrapf(err, "failed to define handler for docs")
	// 	}
	// 	endpoints["/api-docs"] = map[string]interface{}{
	// 		"GET": docsHandler,
	// 	}
	// }
	return r, nil
}