package utils

import (
	"fmt"
	"net/url"
	"regexp"
	"strings"

	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/import/cloud_storage"
)

var AzureStorageAccountRe = regexp.MustCompile(`^([a-z0-9]+)\.blob\.core\.windows\.net$`)

const InvalidAzureUriErrMsg = "Invalid Azure Blob URI. Expected format: (azure|https)://<account>.blob.core.windows.net/<container>/<path>"

func ParseAzureURI(uri string) (accountName string, containerUri *url.URL, bizErr bizerr.BizError) {
	// url format: (azure|https)://<account>.blob.core.windows.net/<container>/<path>
	// Lightning azure url format: azure:/<container>/<path>?account-name=<account>&sas-token=<sas-token>
	if !strings.HasPrefix(uri, "azure://") && !strings.HasPrefix(uri, "https://") {
		return "", nil, bizerr.New(bizerr.ErrCodeParams, InvalidAzureUriErrMsg)
	}
	parsedUrl, err := url.Parse(cloud_storage.EscapePath(uri))
	if err != nil {
		return "", nil, bizerr.New(bizerr.ErrCodeParams, InvalidAzureUriErrMsg)
	}
	// parsedUrl.Path format: /<container-name>/<blob-name>
	sourceUrl, err := url.Parse(fmt.Sprintf("azure:/%s", parsedUrl.EscapedPath()))
	if err != nil {
		return "", nil, bizerr.New(bizerr.ErrCodeParams, InvalidAzureUriErrMsg)
	}
	// parsedUrl.Host format: <storage-account-name>.blob.core.windows.net
	subMatch := AzureStorageAccountRe.FindStringSubmatch(parsedUrl.Host)
	if len(subMatch) != 2 {
		return "", nil, bizerr.New(bizerr.ErrCodeParams, InvalidAzureUriErrMsg)
	}
	return subMatch[1], sourceUrl, nil
}
