package oci

import (
	_ "embed"
	"encoding/json"
	"fmt"
	"sort"
	"strings"
	"sync"
)

// regionsJSON 是本地维护的 OCI 区域表。官方 API（ListRegions、
// ListRegionSubscriptions 等）只返回 key 和 name，控制台风格的
// 友好名称（alias）官方不提供查询接口，因此在此文件旁的
// regions.json 中单独维护，新增区域时直接编辑该文件。
//
//go:embed regions.json
var regionsJSON []byte

// RegionInfo 描述一个 OCI 区域。
type RegionInfo struct {
	Alias string `json:"alias"`
	Key   string `json:"key"`
	Name  string `json:"name"`
}

var loadRegions = sync.OnceValues(func() ([]RegionInfo, error) {
	var regions []RegionInfo
	if err := json.Unmarshal(regionsJSON, &regions); err != nil {
		return nil, fmt.Errorf("parse embedded regions.json: %w", err)
	}
	// 全局统一按友好名排序，维护 regions.json 时无需关心条目顺序
	sort.SliceStable(regions, func(i, j int) bool { return regions[i].Alias < regions[j].Alias })
	return regions, nil
})

// AllRegions 返回本地维护的完整区域表。
func AllRegions() ([]RegionInfo, error) {
	return loadRegions()
}

// RegionByKey 按三字码（如 FRA）查找区域，大小写不敏感。
func RegionByKey(key string) (RegionInfo, bool) {
	regions, err := loadRegions()
	if err != nil {
		return RegionInfo{}, false
	}
	for _, r := range regions {
		if strings.EqualFold(r.Key, key) {
			return r, true
		}
	}
	return RegionInfo{}, false
}
