// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .

package iplibrary_test

import (
	"fmt"
	"github.com/TeaOSLab/EdgeCommon/pkg/iplibrary"
	"net"
	"runtime"
	"runtime/debug"
	"testing"
	"time"
)

func TestIPLibrary_Init(t *testing.T) {
	var lib = iplibrary.NewIPLibrary()

	err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "", iplibrary.ReaderVersionV1)
	if err != nil {
		t.Fatal(err)
	}
}

func TestIPLibrary_Load(t *testing.T) {
	for i := 0; i < 10; i++ {
		err := iplibrary.InitDefault()
		if err != nil {
			t.Fatal(err)
		}
	}
}

func TestIPLibrary_Lookup(t *testing.T) {
	var stat1 = &runtime.MemStats{}
	runtime.ReadMemStats(stat1)

	var lib = iplibrary.NewIPLibrary()

	var before = time.Now()

	err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "", iplibrary.ReaderVersionV1)
	if err != nil {
		t.Fatal(err)
	}

	var costMs = time.Since(before).Seconds() * 1000
	runtime.GC()
	debug.FreeOSMemory()

	var stat2 = &runtime.MemStats{}
	runtime.ReadMemStats(stat2)

	t.Log((stat2.Alloc-stat1.Alloc)/1024/1024, "M", fmt.Sprintf("%.2f", costMs), "ms")

	for _, ip := range []string{
		"127.0.0.1",
		"8.8.8.8",
		"4.4.4.4",
		"202.96.0.20",
		"111.197.165.199",
		"66.249.66.69",
		"2222",                           // wrong ip
		"2406:8c00:0:3401:133:18:168:70", // ipv6
	} {
		var result = lib.Lookup(net.ParseIP(ip))
		t.Log(ip, "=>", result.IsOk(), "[", result.CountryName(), result.CountryId(), "][", result.ProvinceName(), result.ProvinceId(), "][", result.TownName(), result.TownId(), "][", result.ProviderName(), result.ProviderId(), "]")
	}
}

func TestIPLibrary_LookupIP(t *testing.T) {
	var lib = iplibrary.NewIPLibrary()
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "", iplibrary.ReaderVersionV1)
	if err != nil {
		t.Fatal(err)
	}

	for _, ip := range []string{
		"66.249.66.69",
	} {
		var result = lib.LookupIP(ip)
		if result.IsOk() {
			t.Log(ip, "=>", result.IsOk(), "[", result.CountryName(), result.CountryId(), "][", result.ProvinceName(), result.ProvinceId(), "][", result.TownName(), result.TownId(), "][", result.ProviderName(), result.ProviderId(), "]")
		} else {
			t.Log(ip, "=>", result.IsOk())
		}
	}
}

func TestIPLibrary_LookupIP_Summary(t *testing.T) {
	var lib = iplibrary.NewIPLibrary()
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "", iplibrary.ReaderVersionV1)
	if err != nil {
		t.Fatal(err)
	}

	for _, ip := range []string{
		"66.249.66.69",
		"123456", // wrong ip
		"",       // empty
	} {
		var result = lib.LookupIP(ip)
		if result.IsOk() {
			t.Log(ip, "=>", "region summary:", result.RegionSummary(), "summary:", result.Summary())
		} else {
			t.Log(ip, "=>", "region summary:", result.RegionSummary(), "summary:", result.Summary())
		}
	}
}

func TestIPLibrary_LookupIPSummaries(t *testing.T) {
	_ = iplibrary.InitDefault()
	t.Logf("%+v", iplibrary.LookupIPSummaries([]string{
		"127.0.0.1",
		"8.8.8.8",
		"4.4.4.4",
		"202.96.0.20",
		"111.197.165.199",
		"66.249.66.69",
		"2222",                           // wrong ip
		"2406:8c00:0:3401:133:18:168:70", // ipv6
	}))
}

func BenchmarkIPLibrary_Lookup(b *testing.B) {
	var lib = iplibrary.NewIPLibrary()
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "", iplibrary.ReaderVersionV1)
	if err != nil {
		b.Fatal(err)
	}

	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		_ = lib.LookupIP("66.249.66.69")
	}
}
