package runtime

import (
	"context"

	appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1"
	autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
	reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
	"cosmossdk.io/core/comet"
	"cosmossdk.io/core/header"

	"git.cw.tr/mukan-network/mukan-sdk/runtime/services"
	sdk "git.cw.tr/mukan-network/mukan-sdk/types"
	"git.cw.tr/mukan-network/mukan-sdk/types/module"
)

func (a *App) registerRuntimeServices(cfg module.Configurator) error {
	// no app config service if user is using app.yaml / app.json
	// it is as in v0.52, this whole query service does not exist at all.
	if a.appConfig != nil {
		appv1alpha1.RegisterQueryServer(cfg.QueryServer(), services.NewAppQueryService(a.appConfig))
	}
	autocliv1.RegisterQueryServer(cfg.QueryServer(), services.NewAutoCLIQueryService(a.ModuleManager.Modules))

	reflectionSvc, err := services.NewReflectionService()
	if err != nil {
		return err
	}
	reflectionv1.RegisterReflectionServiceServer(cfg.QueryServer(), reflectionSvc)

	return nil
}

var _ comet.BlockInfoService = cometInfoService{}

type cometInfoService struct{}

func (cometInfoService) GetCometBlockInfo(ctx context.Context) comet.BlockInfo {
	return sdk.UnwrapSDKContext(ctx).CometInfo()
}

var _ header.Service = headerInfoService{}

type headerInfoService struct{}

func (headerInfoService) GetHeaderInfo(ctx context.Context) header.Info {
	return sdk.UnwrapSDKContext(ctx).HeaderInfo()
}
