package models

import (
	"fmt"
	"net"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestModels(t *testing.T) {
	expectedCity := &GeoRecord{
		Country: struct {
			ISOCode string            "maxminddb:\"iso_code\""
			Names   map[string]string "maxminddb:\"names\""
		}{
			ISOCode: "GB",
			Names: map[string]string{
				"de":    "Vereinigtes Königreich",
				"en":    "United Kingdom",
				"es":    "Reino Unido",
				"fr":    "Royaume-Uni",
				"ja":    "イギリス",
				"pt-BR": "Reino Unido",
				"ru":    "Великобритания",
				"zh-CN": "英国",
			},
		},
		City: struct {
			Names map[string]string "maxminddb:\"names\""
		}{
			Names: map[string]string{
				"de":    "London",
				"en":    "London",
				"es":    "Londres",
				"fr":    "Londres",
				"ja":    "ロンドン",
				"pt-BR": "Londres",
				"ru":    "Лондон",
			},
		},
		Location: struct {
			Latitude  float64 "maxminddb:\"latitude\""
			Longitude float64 "maxminddb:\"longitude\""
			TimeZone  string  "maxminddb:\"time_zone\""
		}{
			Latitude:  51.5142,
			Longitude: -0.0931,
			TimeZone:  "Europe/London",
		},
		Postal: struct {
			Code string "maxminddb:\"code\""
		}{
			Code: "",
		},
	}

	expectedASN := &ASNRecord{
		AutonomousSystemNumber:       12552,
		AutonomousSystemOrganization: "IP-Only",
	}

	db, err := Setup("../test/GeoIP2-City-Test.mmdb", "../test/GeoLite2-ASN-Test.mmdb")
	require.NoError(t, err, fmt.Sprintf("Error setting up db: %s", err))
	defer db.CloseDBs()
	assert.NotNil(t, db.ASN)
	assert.NotNil(t, db.City)

	cityRecord, err := db.LookupCity(net.ParseIP("81.2.69.192"))
	require.NoError(t, err, fmt.Sprintf("Error looking up city: %s", err))
	assert.Equal(t, expectedCity, cityRecord)
	_, err = db.LookupCity(net.ParseIP("error"))
	assert.Error(t, err)

	asnRecord, err := db.LookupASN(net.ParseIP("82.99.17.64"))
	require.NoError(t, err, fmt.Sprintf("Error looking up asn: %s", err))
	assert.Equal(t, expectedASN, asnRecord)
	_, err = db.LookupASN(net.ParseIP("error"))
	assert.Error(t, err)
}