package utils

import (
	"context"
	"fmt"
	"strings"

	"google.golang.org/grpc/metadata"
)

func GetClientIP(ctx context.Context) (string, error) {
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		return "", fmt.Errorf("failed to invoke FromIncomingContext")
	}

	headers := md.Get("X-Forwarded-For")
	return parseXForwardedFor(headers)
}

// parseXForwardedFor follow: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For#syntax
func parseXForwardedFor(headers []string) (string, error) {
	if len(headers) == 0 {
		return "", fmt.Errorf("no header: X-Forwarded-For")
	}
	// there should only be one header
	header := headers[0]
	for _, each := range strings.Split(header, ",") {
		return strings.TrimSpace(each), nil
	}

	return "", nil
}
