package main

import (
	"log"
	"strings"

	"gopkg.in/yaml.v2"
)

type EmailServiceProvider struct {
	Name  string                     `yaml:"name"`
	Items []EmailServiceProviderItem `yaml:"items"`
}
type EmailServiceProviderItem struct {
	Urls        []string          `yaml:"urls"`
	ReqParams   map[string]string `yaml:"req,omitempty,flow"`
	QueryParams []string          `yaml:"params,omitempty"`
	Location    string            `yaml:"location_prefix,omitempty"`
}

var emailSP *[]EmailServiceProvider

func init() {
	emailSP = &[]EmailServiceProvider{}
	err := yaml.Unmarshal(EmailServiceProvidersDefinitionYaml, emailSP)
	if err != nil {
		log.Fatal(err)
	}

}

func emailServiceProvider(hit map[string]string, Referrer *UrlParams) {
	hit["EmailServiceProvider"] = ""
	if hit["URL"] == "" {
		return
	}
	host := Referrer.Host
	host = strings.TrimPrefix(host, "www.")
	host = strings.TrimPrefix(host, "m.")

	// сначала ищем прямое вхождение домена
	emailSPName := searchEmailServiceProvider(host, Referrer)
	if emailSPName == "" {
		// затем заменяем TLD на {}
		host = prepareSearchEngineHost(host)
		emailSPName = searchEmailServiceProvider(host, Referrer)
	}
	hit["EmailServiceProvider"] = emailSPName

}

func searchEmailServiceProvider(host string, ref *UrlParams) (emailSPName string) {
	for _, se := range *emailSP {
		for _, item := range se.Items {
			if checkEmailServiceProvider(item, ref, host) {
				emailSPName = se.Name
				return
			}

		}
	}
	return
}

func checkEmailServiceProvider(item EmailServiceProviderItem, ref *UrlParams, host string) bool {
	var founded = false
	for _, url := range item.Urls {
		if url == host {
			founded = true
			break
		}
	}
	if !founded {
		return false
	}
	// проверка обязательных параметров в url
	for key, value := range item.ReqParams {
		if mapValue, exists := ref.QueryMap[key]; !exists || value != mapValue {
			return false
		}
	}

	if item.Location != "" && !strings.HasPrefix(ref.Path, item.Location) {
		return false
	}
	return true
}
