package main

import (
	"context"
	"errors"
	"testing"

	"sub2api-cn-relay-manager/internal/app"
)

func TestRunCallsApplicationServerRunnerAfterBootstrap(t *testing.T) {
	serverApp := app.NewServer("127.0.0.1:0", nil, nil)
	bootstrapCalled := false
	runnerCalled := false

	err := run(
		context.Background(),
		func(context.Context) (*app.Server, error) {
			bootstrapCalled = true
			return serverApp, nil
		},
		func(_ context.Context, got *app.Server) error {
			runnerCalled = true
			if got != serverApp {
				t.Fatal("run() passed unexpected server instance to runner")
			}
			return nil
		},
	)
	if err != nil {
		t.Fatalf("run() returned error: %v", err)
	}

	if !bootstrapCalled {
		t.Fatal("run() did not call bootstrap")
	}

	if !runnerCalled {
		t.Fatal("run() did not call server runner")
	}
}

func TestRunReturnsBootstrapError(t *testing.T) {
	wantErr := errors.New("bootstrap failed")

	err := run(
		context.Background(),
		func(context.Context) (*app.Server, error) {
			return nil, wantErr
		},
		func(context.Context, *app.Server) error {
			t.Fatal("run() called runner after bootstrap error")
			return nil
		},
	)
	if !errors.Is(err, wantErr) {
		t.Fatalf("run() error = %v, want %v", err, wantErr)
	}
}

func TestRunReturnsApplicationRunError(t *testing.T) {
	wantErr := errors.New("server run failed")
	serverApp := app.NewServer("127.0.0.1:0", nil, nil)

	err := run(
		context.Background(),
		func(context.Context) (*app.Server, error) {
			return serverApp, nil
		},
		func(context.Context, *app.Server) error {
			return wantErr
		},
	)
	if !errors.Is(err, wantErr) {
		t.Fatalf("run() error = %v, want %v", err, wantErr)
	}
}
