package acceptance

import (
	"context"
	"encoding/json"
	"testing"
)

type loginResponse struct {
	Token string `json:"token"`
}

func loginAdmin(t *testing.T, ctx context.Context, client *Client, c Config) string {
	t.Helper()
	return login(t, ctx, client, "/v1/auth/admin/login", c.AdminEmail, c.AdminPassword)
}

func loginUser(t *testing.T, ctx context.Context, client *Client, c Config) string {
	t.Helper()
	return login(t, ctx, client, "/v1/auth/login", c.UserEmail, c.UserPassword)
}

func login(t *testing.T, ctx context.Context, client *Client, path string, email string, password string) string {
	t.Helper()
	requireSecret(t, "login email", email)
	requireSecret(t, "login password", password)

	envelope, raw, status, err := client.PostJSON(ctx, path, map[string]string{
		"email":    email,
		"password": password,
	})
	if err != nil {
		t.Fatalf("login request failed: %v", err)
	}
	assertOK(t, envelope, raw, status)

	var data loginResponse
	if err := json.Unmarshal(envelope.Data, &data); err != nil {
		t.Fatalf("decode login response: %v", err)
	}
	if data.Token == "" {
		t.Fatal("login response token is empty")
	}
	return data.Token
}
