package application

import (
	"net/http"

	"goauthentik.io/api/v3"
	"goauthentik.io/internal/outpost/ak"
)

type testServer struct {
	api  *ak.APIController
	apps []*Application
}

func newTestServer() *testServer {
	return &testServer{
		api: ak.MockAK(
			api.Outpost{
				Config: map[string]interface{}{
					"authentik_host": ak.TestSecret(),
				},
			},
			ak.MockConfig(),
		),
		apps: make([]*Application, 0),
	}
}

func (ts *testServer) API() *ak.APIController {
	return ts.api
}

func (ts *testServer) CryptoStore() *ak.CryptoStore {
	return nil
}

func (ts *testServer) Apps() []*Application {
	return ts.apps
}

func newTestApplication() *Application {
	ts := newTestServer()
	a, _ := NewApplication(
		api.ProxyOutpostConfig{
			Name:                       ak.TestSecret(),
			ClientId:                   api.PtrString(ak.TestSecret()),
			ClientSecret:               api.PtrString(ak.TestSecret()),
			CookieSecret:               api.PtrString(ak.TestSecret()),
			ExternalHost:               "https://ext.t.goauthentik.io",
			InternalHost:               api.PtrString("http://backend"),
			InternalHostSslValidation:  api.PtrBool(true),
			CookieDomain:               api.PtrString(""),
			Mode:                       api.PROXYMODE_FORWARD_SINGLE.Ptr(),
			SkipPathRegex:              api.PtrString("/skip.*"),
			BasicAuthEnabled:           api.PtrBool(true),
			BasicAuthUserAttribute:     api.PtrString("username"),
			BasicAuthPasswordAttribute: api.PtrString("password"),
			OidcConfiguration: api.OpenIDConnectConfiguration{
				AuthorizationEndpoint: "http://fake-auth.t.goauthentik.io/auth",
				TokenEndpoint:         "http://fake-auth.t.goauthentik.io/token",
				UserinfoEndpoint:      "http://fake-auth.t.goauthentik.io/userinfo",
			},
		},
		http.DefaultClient,
		ts,
	)
	ts.apps = append(ts.apps, a)
	return a
}