package app

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/app/installation"
	"github.com/tidbcloud/AgentTeam/internal/store/model"
	"github.com/tidbcloud/AgentTeam/internal/store/serviceactor"
)

func loadAppExecutionCapability(
	ctx context.Context,
	queryer coredb.QueryRower,
	serviceDefinitionID string,
) (model.AppExecutionCapability, bool, error) {
	var payload []byte
	err := queryer.QueryRow(ctx, `
SELECT config
FROM service_capabilities
WHERE service_definition_id = $1
  AND service_kind = $2
  AND capability_key = $3
LIMIT 1
`, strings.TrimSpace(serviceDefinitionID), serviceactor.KindApp,
		serviceactor.CapabilityMCPTools).Scan(&payload)
	if coredb.IsNotFound(err) {
		return model.AppExecutionCapability{}, false, nil
	}
	if err != nil {
		return model.AppExecutionCapability{}, false,
			fmt.Errorf("load App execution capability: %w", err)
	}
	capability, err := model.DecodeAppExecutionCapability(payload)
	if err != nil {
		return model.AppExecutionCapability{}, false,
			fmt.Errorf("decode App execution capability: %w", err)
	}
	return capability, true, nil
}

func requireGenericAppSetupAllowed(
	ctx context.Context,
	queryer coredb.QueryRower,
	serviceDefinitionID string,
) error {
	featureOwned, err := appUsesFeatureOwnedSetup(
		ctx,
		queryer,
		serviceDefinitionID,
	)
	if err != nil {
		return err
	}
	if featureOwned {
		return badRequest(
			"This App must be installed and connected through its feature-owned setup flow.",
		)
	}
	return nil
}

func appUsesFeatureOwnedSetup(
	ctx context.Context,
	queryer coredb.QueryRower,
	serviceDefinitionID string,
) (bool, error) {
	return installation.AppUsesFeatureOwnedSetup(ctx, queryer, serviceDefinitionID)
}
