package ak

import (
	"encoding/base64"
	"fmt"
	"math/rand"
	"net/http"
	"time"

	"github.com/google/uuid"
	"github.com/gorilla/securecookie"
	log "github.com/sirupsen/logrus"
	"goauthentik.io/api/v3"
)

func TestSecret() string {
	return base64.RawURLEncoding.EncodeToString(securecookie.GenerateRandomKey(32))
}

func MockConfig() api.Config {
	return *api.NewConfig(
		*api.NewErrorReportingConfig(false, "test", false, 0.0),
		[]api.CapabilitiesEnum{},
		100,
		100,
		100,
		100,
	)
}

func MockAK(outpost api.Outpost, globalConfig api.Config) *APIController {
	config := api.NewConfiguration()
	config.HTTPClient = &http.Client{
		Transport: GetTLSTransport(),
	}
	token := TestSecret()
	config.AddDefaultHeader("Authorization", fmt.Sprintf("Bearer %s", token))

	// create the API client, with the transport
	apiClient := api.NewAPIClient(config)

	log := log.WithField("logger", "authentik.outpost.ak-api-controller")

	log.WithField("name", outpost.Name).Debug("Fetched outpost configuration")

	log.Debug("Fetched global configuration")

	// doGlobalSetup is called by the OnRefresh handler, which ticks on start
	// doGlobalSetup(outpost, akConfig)

	ac := &APIController{
		Client:       apiClient,
		GlobalConfig: &globalConfig,

		token:  token,
		logger: log,

		reloadOffset:        time.Duration(rand.Intn(10)) * time.Second,
		instanceUUID:        uuid.New(),
		Outpost:             outpost,
		wsBackoffMultiplier: 1,
		refreshHandlers:     make([]func(), 0),
	}
	ac.logger.WithField("offset", ac.reloadOffset.String()).Debug("HA Reload offset")
	return ac
}