// Package geoipx contains code to use the embedded MaxMind-like databases.
package geoipx

import (
	"net"

	"github.com/ooni/probe-assets/assets"
	"github.com/bassosimone/oonidsl/internal/model"
	"github.com/bassosimone/oonidsl/internal/runtimex"
	"github.com/oschwald/geoip2-golang"
)

// TODO(bassosimone): this would be more efficient if we'd open just
// once the database and then reuse it for every address.

// LookupASN maps [ip] to an AS number and an AS organization name.
func LookupASN(ip string) (asn uint, org string, err error) {
	asn, org = model.DefaultProbeASN, model.DefaultProbeNetworkName
	db, err := geoip2.FromBytes(assets.ASNDatabaseData())
	runtimex.PanicOnError(err, "cannot load embedded geoip2 ASN database")
	defer db.Close()
	record, err := db.ASN(net.ParseIP(ip))
	if err != nil {
		return
	}
	asn = record.AutonomousSystemNumber
	if record.AutonomousSystemOrganization != "" {
		org = record.AutonomousSystemOrganization
	}
	return
}

// LookupCC maps [ip] to a country code.
func LookupCC(ip string) (cc string, err error) {
	cc = model.DefaultProbeCC
	db, err := geoip2.FromBytes(assets.CountryDatabaseData())
	runtimex.PanicOnError(err, "cannot load embedded geoip2 country database")
	defer db.Close()
	record, err := db.Country(net.ParseIP(ip))
	if err != nil {
		return
	}
	// With MaxMind DB we used record.RegisteredCountry.IsoCode but that does
	// not seem to work with the db-ip.com database. The record is empty, at
	// least for my own IP address in Italy. --Simone (2020-02-25)
	if record.Country.IsoCode != "" {
		cc = record.Country.IsoCode
	}
	return
}
