package main

import (
	"log"
	"strconv"

	"github.com/hashicorp/golang-lru"
	"github.com/ua-parser/uap-go/uaparser"
	"strings"
)

var uaParser *uaparser.Parser
var uaCache *lru.TwoQueueCache
var uaClient *uaparser.Client

//var uaCache map[string]map[string]string

func init() {
	var err error
	uaParser, err = uaparser.NewFromBytes(UaparserDefinitionYaml)
	if err != nil {
		log.Fatal(err)
	}

	uaCache, _ = lru.New2Q(500)
}
func useragent(hit map[string]string, ua string) {
	val, ok := uaCache.Get(ua)
	if ok {
		uaClient = val.(*uaparser.Client)
	} else {
		uaClient = uaParser.Parse(ua)
		uaCache.Add(ua, uaClient)
	}
	hit["UserAgent"] = ua

	hit["Browser"] = uaClient.UserAgent.Family
	hit["BrowserMajorVersion"] = parseNumericVersion(uaClient.UserAgent.Major)
	hit["BrowserMinorVersion"] = parseNumericVersion(uaClient.UserAgent.Minor)
	hit["OperatingSystem"] = uaClient.Os.Family
	hit["OperatingSystemMajorVersion"] = parseVersion(uaClient.Os.Major)
	//fix win 8.1 and xp
	if len(uaClient.Os.Major) > 0 {
		_, err := strconv.Atoi(uaClient.Os.Major)
		if err != nil || (hit["OperatingSystem"] == "Windows" && len(hit["OperatingSystemMajorVersion"]) > 0) {
			hit["OperatingSystem"] = hit["OperatingSystem"] + " " + hit["OperatingSystemMajorVersion"]
			hit["OperatingSystemMajorVersion"] = "0"
		}
	}
	hit["OperatingSystemMinorVersion"] = parseNumericVersion(uaClient.Os.Minor)
	hit["OperatingSystemPatchVersion"] = parseNumericVersion(uaClient.Os.Patch)
	hit["DeviceBrand"] = uaClient.Device.Brand
	hit["DeviceModel"] = uaClient.Device.Model
}

func parseVersion(version string) string {
	if len(version) == 0 {
		return "0"
	}
	if len(version) == 1 {
		return version
	}
	return strings.TrimPrefix(version, "0")
}

func parseNumericVersion(version string) string {
	parsedVersion := parseVersion(version)
	parsedVersionNum, err := strconv.Atoi(parsedVersion)
	if err != nil {
		return "0"
	}
	return strconv.Itoa(parsedVersionNum)
}
