package webhooks

import (
	"context"
	"fmt"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

type AppDefinition struct {
	AppID   string
	AppSlug string
	AppKind string
}

// LoadAppDefinition loads an app definition that may receive webhooks.
func (store *Store) LoadAppDefinition(ctx context.Context, appSlug string) (AppDefinition, error) {
	return LoadAppDefinition(ctx, store.db, appSlug)
}

// LoadAppDefinition loads an app definition that may receive webhooks.
func LoadAppDefinition(ctx context.Context, queryer coredb.QueryRower, appSlug string) (AppDefinition, error) {
	row := queryer.QueryRow(ctx, `
SELECT
    definition.id,
    definition.slug,
    COALESCE(JSON_UNQUOTE(JSON_EXTRACT(definition.config, '$.appKind')), '')
FROM service_definitions definition
WHERE definition.slug = $1
  AND definition.service_kind = 'app'
  AND (
      definition.status = 'active'
      OR (
          EXISTS (
              SELECT 1
              FROM service_installations installation
              WHERE installation.service_definition_id = definition.id
                AND installation.service_kind = definition.service_kind
                AND installation.status = 'active'
          )
      )
  )
`, strings.TrimSpace(appSlug))

	var app AppDefinition
	if err := row.Scan(&app.AppID, &app.AppSlug, &app.AppKind); err != nil {
		if coredb.IsNotFound(err) {
			return AppDefinition{}, ErrNotFound
		}
		return AppDefinition{}, fmt.Errorf("load webhook app definition: %w", err)
	}
	app.AppID = strings.TrimSpace(app.AppID)
	app.AppSlug = strings.TrimSpace(app.AppSlug)
	app.AppKind = strings.TrimSpace(app.AppKind)
	return app, nil
}
