package main

import (
	"strings"
	"unicode"
)

//+ direct прямой заход,
//+ referral - ссылки на сайтах,
//+ external - переход с сайта на другие сайты,
//+ internal - внутренний переход,
//+ ad - реклама,
//+ social - социалки,
//+ saved - сохраненные страницы,
//+ organic - поисковые системы
//+ email - письма
//+ if hit["UTMMedium"]=="organic" - TrafficSource = organic

func trafficSource(hit map[string]string, referer *UrlParams, URL *UrlParams) {
	ts := ""

	if hit["AdvEngine"] != "" && hit["EventType"] == "1" {
		// важно, чтобы ad был раньше social
		ts = "ad"
	} else if hit["SocialNetwork"] != "" && hit["EventType"] == "1" {
		ts = "social"
	} else if (referer.Scheme == "file" || URL.Scheme == "file" ||
		referer.Host == "localhost" || URL.Host == "localhost" ||
		strings.LastIndex(referer.Host, "127.") != -1 || strings.LastIndex(URL.Host, "127.") != -1 ||
		checkLetter(referer.Scheme) || checkLetter(URL.Scheme)) && hit["EventType"] == "1" {
		ts = "saved"
	} else if (hit["UTMMedium"] == "email" ||
		hit["UTMMedium"] == "e-mail" ||
		hit["UTMSource"] == "email" ||
		hit["OpenstatService"] == "email" ||
		hit["OpenstatService"] == "e-mail" ||
		hit["OpenstatSource"] == "email" ||
		hit["OpenstatSource"] == "e-mail" || hit["EmailServiceProvider"] != "") && hit["EventType"] == "1" {
		ts = "email"
	} else if (hit["SearchEngine"] != "" || hit["UTMMedium"] == "organic") && hit["EventType"] == "1" {
		ts = "organic"
	} else if hit["Referer"] == "" && (hit["EventType"] == "1" || hit["EventType"] == "2") {
		ts = "direct"
	} else if hit["EventType"] == "1" && referer.Host == URL.Host {
		// переход с наших сайтов на наш
		ts = "internal"
	} else if hit["EventType"] == "2" && referer.Host != URL.Host {
		// переход по внешней ссылке на другой сайт
		ts = "external"
	} else if hit["EventType"] == "1" && referer.Host != URL.Host {
		// переход с других сайтов на наш
		ts = "referral"
	}

	hit["TrafficSource"] = ts
}

func checkLetter(str string) bool {
	if str == "" || len(str) > 1 {
		return false
	}
	return unicode.IsLetter([]rune(str)[0])
}
