package app

import (
	"context"
	"errors"
	"fmt"
	"log/slog"
	"net/http"
	"runtime/debug"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/store/app/webhooks"
)

// providerPullRequestResource is the resource shape shared by provider webhook
// normalizers and provider API lookups.
type providerPullRequestResource struct {
	ResourceType       string
	ResourceIdentifier string
	ResourceURL        string
}

type providerWebhookHandler interface {
	HandleWebhook(context.Context, webhooks.AppDefinition, http.Header, []byte) (AppWebhookResult, error)
}

var errAppHandlerPanic = errors.New("app handler panic")

var ErrAppHandlerPanic = errAppHandlerPanic

func safeHandleProviderWebhook(
	ctx context.Context,
	logger *slog.Logger,
	handler providerWebhookHandler,
	app webhooks.AppDefinition,
	headers http.Header,
	payload []byte,
) (result AppWebhookResult, err error) {
	defer func() {
		if recovered := recover(); recovered != nil {
			if logger == nil {
				logger = slog.Default()
			}
			logger.Error(
				"app handler panic",
				slog.String("operation", "webhook"),
				slog.String("appSlug", strings.TrimSpace(app.AppSlug)),
				slog.Any("panic", recovered),
				slog.String("stack", string(debug.Stack())),
			)
			result = AppWebhookResult{}
			err = fmt.Errorf("%w: webhook", errAppHandlerPanic)
		}
	}()
	return handler.HandleWebhook(ctx, app, headers, payload)
}
