package reportscollector

import (
	"fmt"
	"log"
	"net"
	"net/http"
	"os"
	"sync"

	geoip2 "github.com/oschwald/geoip2-golang"
)

var (
	geoipDbPath = "/var/lib/GeoIP/GeoLite2-ASN.mmdb"
	geodb       *geoip2.Reader
	geodbInit   sync.Once
)

func initGeoIP() {
	if s := os.Getenv("GEOIP_DB_PATH"); s != "" {
		geoipDbPath = s
	}

	var err error
	geodb, err = geoip2.Open(geoipDbPath)
	if err != nil {
		log.Printf("warning: could not open GeoIP db: %v", err)
		return
	}
}

func lookupASN(addr string) (string, bool) {
	geodbInit.Do(initGeoIP)

	if geodb != nil {
		ip := net.ParseIP(addr)
		if ip == nil {
			return "", false
		}
		asn, err := geodb.ASN(ip)
		if err == nil {
			return fmt.Sprintf("AS%d", asn.AutonomousSystemNumber), true
		}
	}
	return "", false
}

func getRemoteIP(req *http.Request) string {
	if addr := req.Header.Get("X-Forwarded-For"); addr != "" {
		return addr
	}
	if addr, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
		return addr
	}
	return ""
}