/*
 * Copyright 2026 CloudWeGo Authors
 *
 * 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 internal provides adk internal utils.
package internal

import (
	"fmt"
	"sync/atomic"
)

// Language represents the language setting for the ADK built-in prompts.
type Language uint8

const (
	// LanguageEnglish represents English language.
	LanguageEnglish Language = iota
	// LanguageChinese represents Chinese language.
	LanguageChinese
)

var language atomic.Value

// SetLanguage sets the language for the ADK built-in prompts.
// The default language is English if not explicitly set.
func SetLanguage(lang Language) error {
	if lang != LanguageEnglish &&
		lang != LanguageChinese {
		return fmt.Errorf("invalid language: %v", lang)
	}
	language.Store(lang)
	return nil
}

// GetLanguage returns the current language setting for the ADK built-in prompts.
// Returns LanguageEnglish if no language has been set.
func getLanguage() Language {
	if l, ok := language.Load().(Language); ok {
		return l
	}
	return LanguageEnglish
}

// I18nPrompts holds prompt strings for different languages.
type I18nPrompts struct {
	English string
	Chinese string
}

// SelectPrompt returns the appropriate prompt string based on the current language setting.
// Returns an error if the current language is not supported.
func SelectPrompt(prompts I18nPrompts) string {
	lang := getLanguage()
	switch lang {
	case LanguageEnglish:
		return prompts.English
	case LanguageChinese:
		return prompts.Chinese
	default:
		// unreachable
		panic(fmt.Sprintf("invalid language: %v", lang))
	}
}
