package proxy

import (
	"context"
	"encoding/json"
	"fmt"

	"google.golang.org/protobuf/types/known/structpb"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/dynamic"
)

func listResources(
	ctx context.Context,
	resourceClient dynamic.ResourceInterface,
	labelSelector string,
) (*structpb.Struct, error) {
	listOptions := metav1.ListOptions{}
	if labelSelector != "" {
		listOptions.LabelSelector = labelSelector
	}

	list, err := resourceClient.List(ctx, listOptions)
	if err != nil {
		return nil, fmt.Errorf("failed to list k8s resources: %w", err)
	}

	return objectToStruct(list)
}

func getResource(
	ctx context.Context,
	resourceClient dynamic.ResourceInterface,
	name string,
) (*structpb.Struct, error) {
	item, err := resourceClient.Get(ctx, name, metav1.GetOptions{})
	if err != nil {
		return nil, fmt.Errorf("failed to get k8s resource: %w", err)
	}

	return structpb.NewStruct(item.Object)
}

func objectToStruct(obj any) (*structpb.Struct, error) {
	var objectMap map[string]interface{}

	jsonBytes, err := json.Marshal(obj)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal k8s object to JSON: %w", err)
	}

	if err := json.Unmarshal(jsonBytes, &objectMap); err != nil {
		return nil, fmt.Errorf("failed to unmarshal JSON to map: %w", err)
	}

	objectStruct, err := structpb.NewStruct(objectMap)
	if err != nil {
		return nil, fmt.Errorf("failed to convert map to protobuf struct: %w", err)
	}

	return objectStruct, nil
}
