package utils

import (
	"slices"

	"github.com/juju/errors"
)

type AlicloudRegion struct {
	RegionID  string
	Name      string
	City      string
	Country   string
	Area      string
	UTCOffset string
}

var alicloudRegions = []AlicloudRegion{
	{"cn-hangzhou", "China (Hangzhou)", "Hangzhou", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-shanghai", "China (Shanghai)", "Shanghai", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-beijing", "China (Beijing)", "Beijing", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-qingdao", "China (Qingdao)", "Qingdao", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-zhangjiakou", "China (Zhangjiakou)", "Zhangjiakou", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-huhehaote", "China (Hohhot)", "Hohhot", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-wulanchabu", "China (Ulanqab)", "Ulanqab", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-shenzhen", "China (Shenzhen)", "Shenzhen", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-heyuan", "China (Heyuan)", "Heyuan", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-guangzhou", "China (Guangzhou)", "Guangzhou", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-chengdu", "China (Chengdu)", "Chengdu", "CN", "Asia Pacific", "UTC+08:00"},
	{"cn-hongkong", "China (Hong Kong)", "Hong Kong", "CN", "Asia Pacific", "UTC+08:00"},
	{"ap-southeast-1", "Singapore", "Singapore", "SG", "Asia Pacific", "UTC+08:00"},
	{"ap-southeast-3", "Malaysia (Kuala Lumpur)", "Kuala Lumpur", "MY", "Asia Pacific", "UTC+08:00"},
	{"ap-southeast-7", "Thailand (Bangkok)", "Bangkok", "TH", "Asia Pacific", "UTC+07:00"},
	{"ap-southeast-6", "Philippines (Manila)", "Manila", "PH", "Asia Pacific", "UTC+08:00"},
	{"ap-southeast-5", "Indonesia (Jakarta)", "Jakarta", "ID", "Asia Pacific", "UTC+07:00"},
	{"ap-south-1", "India (Mumbai)", "Mumbai", "IN", "Asia Pacific", "UTC+05:30"},
	{"ap-northeast-1", "Japan (Tokyo)", "Tokyo", "JP", "Asia Pacific", "UTC+09:00"},
	{"ap-northeast-2", "South Korea (Seoul)", "Seoul", "KR", "Asia Pacific", "UTC+09:00"},
	{"eu-central-1", "Germany (Frankfurt)", "Frankfurt", "DE", "Europe", "UTC+02:00"},
	{"eu-west-1", "UK (London)", "London", "GB", "Europe", "UTC+01:00"},
	{"us-east-1", "US (Virginia)", "Virginia", "US", "North America", "UTC-04:00"},
	{"us-west-1", "US (Silicon Valley)", "Silicon Valley", "US", "North America", "UTC-0:00"},
	{"na-south-1", "Mexico", "Mexico", "MX", "North America", "UTC-06:00"},
	{"me-east-1", "UAE (Dubai)", "Dubai", "AE", "Middle East", "UTC+04:00"},
	{"me-central-1", "SAU (Riyadh)", "Riyadh", "SA", "Middle East", "UTC+03:00"},
}

func GetAliCloudRegionName(region string) (string, error) {
	index := slices.IndexFunc(alicloudRegions, func(e AlicloudRegion) bool {
		return e.RegionID == region
	})
	if index < 0 {
		return "", errors.NotFoundf("Region %s", region)
	}

	return alicloudRegions[index].Name, nil
}

func GetAliCloudRegionArea(region string) (string, error) {
	index := slices.IndexFunc(alicloudRegions, func(e AlicloudRegion) bool {
		return e.RegionID == region
	})
	if index < 0 {
		return "", errors.NotFoundf("Region %s", region)
	}

	return alicloudRegions[index].Area, nil
}

func GetAliCloudRegionCountryCode(region string) (string, error) {
	index := slices.IndexFunc(alicloudRegions, func(e AlicloudRegion) bool {
		return e.RegionID == region

	})
	if index < 0 {
		return "", errors.NotFoundf("Region %s", region)
	}

	return alicloudRegions[index].Country, nil
}

func GetAliCloudRegionBackupTime(region string) (string, error) {
	index := slices.IndexFunc(alicloudRegions, func(e AlicloudRegion) bool {
		return e.RegionID == region

	})
	if index < 0 {
		return "", errors.NotFoundf("Region %s", region)
	}
	return GetBackupTimeByTimeZone(alicloudRegions[index].UTCOffset)
}
