package integration

import (
	"bytes"
	"fmt"
	"net/http"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"

	"edge-infra.dev/pkg/lib/fog"
	"edge-infra.dev/pkg/sds/emergencyaccess/authservice/server"
	"edge-infra.dev/pkg/sds/emergencyaccess/authservice/setup"
	"edge-infra.dev/pkg/sds/emergencyaccess/config"
	"edge-infra.dev/test/f2"
	"edge-infra.dev/test/f2/x/postgres"
)

func TestHealth(t *testing.T) {
	var (
		engine *gin.Engine
	)

	feat := f2.NewFeature("Health tests").
		Setup("Create service", func(ctx f2.Context, t *testing.T) f2.Context {
			var (
				pg = postgres.FromContextT(ctx, t)
			)

			// Dataset setup
			conf := setup.Config{
				SQL: config.SQLConfig{
					ConnectionName: pg.ConnectionName,
					DatabaseName:   pg.Database,
					User:           pg.User,
					Password:       pg.Password,
					Host:           pg.Host,
					Port:           fmt.Sprint(pg.Port),
					Schema:         pg.Schema(),
				},
			}

			buf := new(bytes.Buffer)
			log := fog.New(fog.To(buf))

			re, checks, err := setup.CreateAuthservice(log, conf)
			require.NoError(t, err)

			// Server Setup
			gin.SetMode(gin.TestMode)
			router := gin.New()

			res := server.New(router, log, re, checks...)

			engine = res.GinEngine
			return ctx
		}).
		Test("Test health ok", func(ctx f2.Context, t *testing.T) f2.Context {
			test := testCase{
				url:    "/health",
				method: http.MethodGet,

				expectedStatus: http.StatusOK,
				expectedOut:    StringEq("ok"),
			}

			return testEndpoint(ctx, t, engine, test)
		}).
		Feature()

	f.Test(t, feat)
}