package app

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

	"github.com/gin-gonic/gin"
	"kra/pkg/module"
	platformtask "kra/pkg/task"
)

func TestTaskRegistryRegistersStaticModuleMethods(t *testing.T) {
	method := platformtask.Method{
		Name: "test.static",
		Run:  func(context.Context, json.RawMessage) error { return nil },
	}
	catalog := module.Catalog{Definitions: []module.Definition{{Tasks: []platformtask.Method{method}}}}
	registry := TaskRegistry(catalog)
	if _, ok := registry.Lookup(method.Name); !ok {
		t.Fatalf("method %q was not registered", method.Name)
	}
}

type testRouteRegistrar struct{ called bool }

func (registrar *testRouteRegistrar) RegisterRoutes(*gin.RouterGroup, *gin.RouterGroup, *gin.Engine) {
	registrar.called = true
}

type testTaskContributor struct{ name string }

func (contributor testTaskContributor) RegisterTasks(registry *platformtask.Registry) {
	registry.Register(platformtask.Method{
		Name: contributor.name,
		Run:  func(context.Context, json.RawMessage) error { return nil },
	})
}

func TestRuntimeAppliesAllContributions(t *testing.T) {
	registry := platformtask.NewRegistry()
	route := &testRouteRegistrar{}
	runtime := Runtime(RuntimeContributions{
		Routes: []module.RouteRegistrar{route},
		Tasks:  []platformtask.Contributor{testTaskContributor{name: "test.runtime"}},
	}, registry)

	if _, ok := registry.Lookup("test.runtime"); !ok {
		t.Fatal("runtime task contributor was not applied")
	}
	runtime.RegisterRoutes(nil, nil, nil)
	if !route.called {
		t.Fatal("runtime route contributor was not called")
	}
}
