package benchmarks_test

import (
	"fmt"
	"testing"
	"time"

	"github.com/pomerium/pomerium/internal/testenv"
	"github.com/pomerium/pomerium/internal/testenv/snippets"
	"github.com/pomerium/pomerium/internal/testenv/upstreams"
)

func BenchmarkStartupLatency(b *testing.B) {
	for _, n := range []int{1, 10, 100, 1000, 10000} {
		b.Run(fmt.Sprintf("routes=%d", n), func(b *testing.B) {
			for range b.N {
				env := testenv.New(b)
				up := upstreams.HTTP(nil)
				for i := range n {
					up.Route().
						From(env.SubdomainURL(fmt.Sprintf("from-%d", i))).
						PPL(`{"allow":{"and":[{"accept":"true"}]}}`)
				}
				env.AddUpstream(up)

				env.Start()
				snippets.WaitStartupComplete(env, 60*time.Minute)

				env.Stop()
			}
		})
	}
}

func BenchmarkAppendRoutes(b *testing.B) {
	for _, n := range []int{1, 10, 100, 1000, 10000} {
		b.Run(fmt.Sprintf("routes=%d", n), func(b *testing.B) {
			for range b.N {
				env := testenv.New(b)
				up := upstreams.HTTP(nil)
				env.AddUpstream(up)

				env.Start()
				snippets.WaitStartupComplete(env)
				for i := range n {
					env.Add(up.Route().
						From(env.SubdomainURL(fmt.Sprintf("from-%d", i))).
						PPL(fmt.Sprintf(`{"allow":{"and":["email":{"is":"user-%d@example.com"}]}}`, i)))
				}
				env.Stop()
			}
		})
	}
}