package http

import (
	"fmt"
	"net/url"
)

func GetOriginFromURLString(s string) (string, error) {
	parsed, err := url.Parse(s)
	if err != nil {
		return "", err
	}
	return fmt.Sprintf("%s://%s", parsed.Scheme, parsed.Host), nil
}

func IsOriginAllowed(allowList []string, origin string) bool {
	for _, allowed := range allowList {
		if allowed == origin {
			return true
		}
	}
	return false
}

// IsOrigin checks if provided string is an origin (scheme://hostname[:port]) without path, query or fragment
func IsOrigin(rawOrigin string) bool {
	parsedUrl, err := url.Parse(rawOrigin)
	if err != nil {
		return false
	}
	return parsedUrl.Scheme != "" && parsedUrl.Host != "" && parsedUrl.Path == "" && len(parsedUrl.Query()) == 0 && parsedUrl.Fragment == ""
}

func BuildHTTP(hostname string, externalPort uint16, secure bool) string {
	if externalPort == 0 || (externalPort == 443 && secure) || (externalPort == 80 && !secure) {
		return BuildOrigin(hostname, secure)
	}
	return BuildOrigin(fmt.Sprintf("%s:%d", hostname, externalPort), secure)
}

func BuildOrigin(host string, secure bool) string {
	schema := "https"
	if !secure {
		schema = "http"
	}
	return fmt.Sprintf("%s://%s", schema, host)
}