/*
File Name:  GeoIP.go
Copyright:  2021 Peernet Foundation s.r.o.
Author:     Peter Kleissner

Support for the free MaxMind database 'GeoLite2 City'.
Information about the database: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data

Potential libraries:
* https://github.com/IncSW/geoip2
* https://github.com/oschwald/maxminddb-golang

The IncSW lib was chosen because it has 0 dependencies - awesome!

*/

package webapi

import (
	"net"

	"github.com/IncSW/geoip2"
	"github.com/PeernetOfficial/core"
)

func (api *WebapiInstance) InitGeoIPDatabase(filename string) (err error) {
	api.geoipCityReader, err = geoip2.NewCityReaderFromFile(filename)
	return err
}

func (api *WebapiInstance) GeoIPLocation(IP net.IP) (latitude, longitude float64, valid bool) {
	if api.geoipCityReader == nil {
		return 0, 0, false
	}

	record, err := api.geoipCityReader.Lookup(IP)
	if err != nil {
		return 0, 0, false
	}

	return record.Location.Latitude, record.Location.Longitude, true
}

func (api *WebapiInstance) Peer2GeoIP(peer *core.PeerInfo) (latitude, longitude float64, valid bool) {
	if connection := peer.GetConnection2Share(false, true, true); connection != nil {
		return api.GeoIPLocation(connection.Address.IP)
	}

	return 0, 0, false
}
