/*
 * SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package env

import (
	"fmt"
	"os"
	"sync"
)

type ResourceScope string

const (
	OrganizationScope ResourceScope = "organization"
	UserScope         ResourceScope = "user"
)

var (
	ApplicationScope ResourceScope
	getScopeOnce     sync.Once
)

func SetResourceScope() (ResourceScope, error) {
	var err error
	getScopeOnce.Do(func() {
		scope := os.Getenv("RESOURCE_SCOPE")
		if scope == "" {
			scope = string(UserScope)
		}

		switch ResourceScope(scope) {
		case OrganizationScope, UserScope:
			ApplicationScope = ResourceScope(scope)
		default:
			err = fmt.Errorf("invalid scope value: %s", scope)
			return
		}
	})

	if err != nil {
		return "", err
	}

	return ApplicationScope, nil
}
