package util

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

// ParseAzureBlobURI parse Azure Blob Storage URI
func ParseAzureBlobURI(uri string) (storageAccount, container, prefix, sasToken string, err error) {
	u, err := url.Parse(uri)
	if err != nil {
		return "", "", "", "", err
	}

	re := regexp.MustCompile(`^([a-z0-9]+)\.blob\.core\.windows\.net`)
	match := re.FindStringSubmatch(u.Host)
	if len(match) <= 1 {
		return "", "", "", "", fmt.Errorf("invalid bucket uri for azure blob storage, no storage account specified")
	}
	storageAccount = match[1]

	s := strings.Split(u.Path, "/")
	if len(s) < 2 || s[1] == "" {
		return "", "", "", "", fmt.Errorf("invalid bucket uri for azure blob storage, no container specified")
	}
	container = s[1]

	if len(s) > 2 {
		prefix = "/" + strings.Join(s[2:], "/")
	}

	sasToken = u.RawQuery
	if sasToken == "" {
		return "", "", "", "", fmt.Errorf("invalid bucket uri for azure blob storage, no SAS token specified")
	}

	return storageAccount, container, prefix, sasToken, nil
}

// ParseS3OrGCSBucketURI parse S3 or GCS bucket URI
func ParseS3OrGCSBucketURI(uri string) (bucket string, prefix string, err error) {
	u, err := url.Parse(uri)
	if err != nil {
		return "", "", err
	}

	bucket = u.Host
	prefix = strings.TrimPrefix(u.Path, "/")

	return bucket, prefix, nil
}
