package webhook

import (
	"encoding/json"
	"fmt"
	"strings"

	webhookcontract "bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/contracts/webhook"
)

// ParsedEvent holds extracted data from a repo:refs_changed webhook.
type ParsedEvent struct {
	Event   webhookcontract.RefsChangedEvent
	RepoID  string
	Master  []webhookcontract.RefChange
}

// ParseRefsChanged unmarshals and validates a repo:refs_changed payload.
func ParseRefsChanged(rawBody []byte, eventKeyHeader string) (ParsedEvent, error) {
	var event webhookcontract.RefsChangedEvent
	if err := json.Unmarshal(rawBody, &event); err != nil {
		return ParsedEvent{}, fmt.Errorf("parse webhook payload: %w", err)
	}

	eventKey := strings.TrimSpace(event.EventKey)
	if eventKey == "" {
		eventKey = strings.TrimSpace(eventKeyHeader)
	}
	if eventKey != webhookcontract.EventRefsChanged {
		return ParsedEvent{}, fmt.Errorf("unsupported event: %q", eventKey)
	}

	repoID, err := event.RepoID()
	if err != nil {
		return ParsedEvent{}, err
	}

	return ParsedEvent{
		Event:  event,
		RepoID: repoID,
		Master: event.MasterChanges(),
	}, nil
}

// EventKeyFromHeader returns the trimmed X-Event-Key header value.
func EventKeyFromHeader(header string) string {
	return strings.TrimSpace(header)
}
