package sts

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

	"github.com/seaweedfs/seaweedfs/weed/iam/policy"
)

// NormalizeSessionPolicy validates and normalizes inline session policy JSON.
// It returns an empty string if the input is empty or whitespace.
func NormalizeSessionPolicy(policyJSON string) (string, error) {
	trimmed := strings.TrimSpace(policyJSON)
	if trimmed == "" {
		return "", nil
	}
	const maxSessionPolicySize = 2048
	if len(trimmed) > maxSessionPolicySize {
		return "", fmt.Errorf("session policy exceeds maximum size of %d characters", maxSessionPolicySize)
	}

	var policyDoc policy.PolicyDocument
	if err := json.Unmarshal([]byte(trimmed), &policyDoc); err != nil {
		return "", fmt.Errorf("invalid session policy JSON: %w", err)
	}
	if err := policy.ValidatePolicyDocument(&policyDoc); err != nil {
		return "", fmt.Errorf("invalid session policy document: %w", err)
	}
	normalized, err := json.Marshal(&policyDoc)
	if err != nil {
		return "", fmt.Errorf("failed to normalize session policy: %w", err)
	}
	return string(normalized), nil
}
