package controller

import (
	"context"
	"fmt"
	"net/http"

	cluster_api "github.com/pomerium/zero-sdk/cluster"
	connect_api "github.com/pomerium/zero-sdk/connect"
	connect_mux "github.com/pomerium/zero-sdk/connect-mux"
	token_api "github.com/pomerium/zero-sdk/token"
)

func (c *controller) InitAPI(ctx context.Context) error {
	fetcher, err := cluster_api.NewTokenFetcher(c.cfg.clusterAPIEndpoint)
	if err != nil {
		return fmt.Errorf("error creating token fetcher: %w", err)
	}

	tokenCache := token_api.NewCache(fetcher, c.cfg.apiToken)

	clusterClient, err := cluster_api.NewAuthorizedClient(c.cfg.clusterAPIEndpoint, tokenCache.GetToken, http.DefaultClient)
	if err != nil {
		return fmt.Errorf("error creating cluster client: %w", err)
	}

	connectClient, err := connect_api.NewAuthorizedConnectClient(ctx, c.cfg.connectAPIEndpoint, tokenCache.GetToken)
	if err != nil {
		return fmt.Errorf("error creating connect client: %w", err)
	}

	c.connectMux = connect_mux.Start(ctx, connectClient)
	c.clusterClient = clusterClient

	return nil
}