package manage

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

type normalizedEventSubscription struct {
	EventKinds []string                    `json:"eventKinds,omitempty"`
	Filter     EventSubscriptionFilterView `json:"filter,omitempty"`
}

func parseEventSubscription(raw string) (*normalizedEventSubscription, error) {
	trimmed := strings.TrimSpace(raw)
	if trimmed == "" {
		return nil, nil
	}
	var subscription normalizedEventSubscription
	if err := json.Unmarshal([]byte(trimmed), &subscription); err != nil {
		return nil, fmt.Errorf("decode trigger event subscription: %w", err)
	}
	for index, eventKind := range subscription.EventKinds {
		subscription.EventKinds[index] = strings.TrimSpace(strings.ToLower(eventKind))
	}
	sort.Strings(subscription.EventKinds)
	subscription.Filter.ResourceIdentifier = strings.TrimSpace(strings.ToLower(subscription.Filter.ResourceIdentifier))
	subscription.Filter.ConnectionRef = strings.TrimSpace(subscription.Filter.ConnectionRef)
	return &subscription, nil
}

func eventSubscriptionView(subscription *normalizedEventSubscription) *EventSubscriptionView {
	if subscription == nil {
		return nil
	}
	return &EventSubscriptionView{
		EventKinds: append([]string(nil), subscription.EventKinds...),
		Filter: EventSubscriptionFilterView{
			ResourceIdentifier: subscription.Filter.ResourceIdentifier,
			ConnectionRef:      subscription.Filter.ConnectionRef,
		},
	}
}
