package utils

import (
	"context"
	"net"
	"net/http"
	"time"

	"github.com/tidbcloud/account/commons/metrics"

	"github.com/tidbcloud/tiinf/errs"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	"github.com/ipinfo/go/v2/ipinfo"
)

var (
	ipInfoClient = ipinfo.NewClient(&http.Client{Timeout: 6 * time.Second}, nil, "")
)

func IP2CountryCode(ctx context.Context, ip string) (string, error) {
	tilog.Info(ctx, "start convert ip to country", zap.Any("ip", ip))
	if ip == "" {
		return "", errs.NewBadRequest("ip is blank", nil)
	}
	nip := net.ParseIP(ip)

	details, err := ipInfoClient.GetIPInfo(nip)
	metrics.IPInfoCallsCounter.Inc()
	tilog.Info(ctx, "convert ip to country result", zap.Any("ip", ip), zap.Any("details", details), zap.Any("err", err))

	if err != nil {
		return "", errs.NewInternalUnknown("convert ip to country error", err)
	}
	return details.Country, nil
}
