#!/usr/bin/python
# encoding: utf-8

import GeoIP
import sys
from numpy import interp
from collections import Counter
from lxml import etree
from lxml.cssselect import CSSSelector

try:
    blank_map_path, = sys.argv[1:]
except ValueError:
    print "Anna argumentideks tee BlankMap-World6.svg failini"
    sys.exit(254)

# Loe sisse värvimata kaardifail kasutades lxml moodulit
# https://upload.wikimedia.org/wikipedia/commons/0/03/BlankMap-World6.svg
document = etree.parse(open(blank_map_path))

# Lae GeoIP andmebaas
gi = GeoIP.open("/usr/share/GeoIP/GeoIP.dat", GeoIP.GEOIP_MEMORY_CACHE)

# Loo tühi Counter objekt
hits = Counter()

# Käi ridahaaval üle standardsisendi
for line in sys.stdin:
    # Kui reas ei esine GET sõnet, hüppa järgmisse tsükklisse
    if "GET" not in line:
        continue

    # Löö rida tühikute järgi juppideks
    fields = line.split()

    # IP aadress esimeses tulbas
    remote_addr = fields[0]

    # Proovi teisendada IP riigikoodiks GeoIP abil
    country = gi.country_code_by_addr(remote_addr)
    if not country:
        # IP aadressi ei saa vastendada riigiga kui tegu on nt sisevõrgu aadressidega,
        # lisaks /usr/share/GeoIP/GeoIP.dat andmebaasis pole IPv6 aadresse
        continue
    hits[country] += 1

for country, count in hits.items():
    # Interpoleeri külastuste arv vahemikus 0 kuni kõige enam külastusi saanud riik
    # värvitoonide vahemikku 120 (roheline) kuni 0 (punane)
    hue = interp(count, [0, max(hits.values())], [180, 0])

    # Leia XPath abil elemendid mille id attribuut on pandud riigikoodiks
    for element in document.xpath("//*[@id='%s']" % country.lower()):

        # Pane riigi <g> tagile külge stiili attribuut
        # kus värvikood võetakse HSL värviruumist (hue ehk toon, külluslikkus 60% ja heledus 60%)
        element.set("style", "fill:hsl(%.2f, 60%%, 60%%)" % hue)

        # Eemalda kõigilt alamelementidelt class attribuut kus sisaldub viide hallile värvile
        for subelement in element:
            subelement.attrib.pop("class", "")

# Kirjuta väljund faili top.svg
# Proovi avada see fail Firefox või Chrome abil nt
with open("top.svg", "w") as fh:
    fh.write(etree.tostring(document))