package main

import (
	"fmt"
	"strings"
)

type killfileItem struct {
	Kdomain  string
	Ksource  string
	Kconfigs stringarray
}

var bChannel chan killfileItem

func init() {

	bChannel = make(chan killfileItem, 1024)
	fmt.Println("Initializing kill channel engine.")

	go bWriteThread()

}

func bWriteThread() {

	for item := range bChannel {

		alreadyInSomeDB := false

		for _, config := range item.Kconfigs {
			if !alreadyInSomeDB {
				alreadyInSomeDB = domainInKillfile(item.Kdomain, config)
			}
			writeInKillfile(item.Kdomain, item.Ksource, config)
		}
		if !alreadyInSomeDB {
			incrementStats("BL domains from "+item.Ksource, 1)
			incrementStats("TOTAL", 1)
		}

	}

}

//DomainKill stores a domain name inside the killfile
func DomainKill(s, durl string, configs stringarray) {

	if len(s) > 2 {

		s = strings.ToLower(s)

		var k killfileItem

		k.Kdomain = s
		k.Ksource = durl
		k.Kconfigs = configs

		bChannel <- k

	}

}

func writeInKillfile(key, value string, config string) {

	stK := []byte(key)
	stV := []byte(value)

	MyZabovKDB := MyZabovKDBs[config]
	err := MyZabovKDB.Put(stK, stV, nil)
	if err != nil {
		fmt.Println("Cannot write to Killfile DB: ", err.Error())
	}

}

func domainInKillfile(domain string, config string) bool {

	s := strings.ToLower(domain)

	MyZabovKDB := MyZabovKDBs[config]
	has, err := MyZabovKDB.Has([]byte(s), nil)
	if err != nil {
		fmt.Println("Cannot read from Killfile DB: ", err.Error())
	}

	return has

}
