package oss

import (
	"fmt"
)

// Region represents OSS region
type Region string

// Constants of region definition
const (
	Hangzhou     = Region("oss-cn-hangzhou")
	Qingdao      = Region("oss-cn-qingdao")
	Beijing      = Region("oss-cn-beijing")
	Hongkong     = Region("oss-cn-hongkong")
	Shenzhen     = Region("oss-cn-shenzhen")
	USWest1      = Region("oss-us-west-1")
	USEast1      = Region("oss-us-east-1")
	APSouthEast1 = Region("oss-ap-southeast-1")
	Shanghai     = Region("oss-cn-shanghai")

	DefaultRegion = Hangzhou
)

// GetEndpoint returns endpoint of region
func (r Region) GetEndpoint(internal bool, bucket string, secure bool) string {
	if internal {
		return r.GetInternalEndpoint(bucket, secure)
	}
	return r.GetInternetEndpoint(bucket, secure)
}

func getProtocol(secure bool) string {
	protocol := "http"
	if secure {
		protocol = "https"
	}
	return protocol
}

// GetInternetEndpoint returns internet endpoint of region
func (r Region) GetInternetEndpoint(bucket string, secure bool) string {
	protocol := getProtocol(secure)
	if bucket == "" {
		return fmt.Sprintf("%s://oss.aliyuncs.com", protocol)
	}
	return fmt.Sprintf("%s://%s.%s.aliyuncs.com", protocol, bucket, string(r))
}

// GetInternalEndpoint returns internal endpoint of region
func (r Region) GetInternalEndpoint(bucket string, secure bool) string {
	protocol := getProtocol(secure)
	if bucket == "" {
		return fmt.Sprintf("%s://oss-internal.aliyuncs.com", protocol)
	}
	return fmt.Sprintf("%s://%s.%s-internal.aliyuncs.com", protocol, bucket, string(r))
}

// GetInternalEndpoint returns internal endpoint of region
func (r Region) GetVPCInternalEndpoint(bucket string, secure bool) string {
	protocol := getProtocol(secure)
	if bucket == "" {
		return fmt.Sprintf("%s://vpc100-oss-cn-hangzhou.aliyuncs.com", protocol)
	}
	if r == USEast1 {
		return r.GetInternalEndpoint(bucket, secure)
	} else {
		return fmt.Sprintf("%s://%s.vpc100-%s.aliyuncs.com", protocol, bucket, string(r))
	}
}