#!/usr/bin/python3


import re
import requests
from bs4 import BeautifulSoup
import sys
from requests.structures import CaseInsensitiveDict
import os

debug=0

localbasedir='/var/lib/brocken'
pubhtml = '/home/andreas/public_html/brocken/index.html'

# view-source:https://webtv.feratel.com/webtv/?cam=3177&t=12&design=v4
site = 'https://www.harztourist.de/brockencam/8_1_0.html'

#https://reqbin.com/req/python/gplpbyk6/get-request-like-mozilla-firefox
headers = CaseInsensitiveDict()
headers["Connection"] = "keep-alive"
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
headers["Upgrade-Insecure-Requests"] = "1"
headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"

data = {}

def parse_value(value):
    return re.sub(r'^<div class="right"[^>]*>\s*(.+)\s*</div>$', '\\1', re.sub(r'\s+', ' ', str(value), flags=re.MULTILINE))

response = requests.get(site, headers = headers)
soup = BeautifulSoup(response.text, "lxml")
wetter = soup.find("div", attrs={"id":"brockenwetter"})
#print(wetter)
zeitpunkt = wetter.find("h3")
#print(zeitpunkt)
data['Zeit'] = re.sub(r'^.*Brockenwetter<br/> *([^<]+) *</h3>.*$', '\\1', str(zeitpunkt))
temperatur = wetter.find("div", attrs={"class":"left temp"})
data['Temperatur'] = re.sub(r'^.*temp">\s*([+-.,0-9]+)\s*°C\s*</div>.*$', '\\1°C', str(temperatur))
nebel = wetter.find("img")
#print("Nebel: ", nebel)
data['Wetter'] = re.sub(r'^.*(alt="[^"]+") src="/shared/wetter/([0-9]+)\.png" (title="[^"]+").*$', '\\1 / \\2 / \\3', str(nebel))


get_tags = wetter.findAll("div", attrs={"class":re.compile(r'(left|right)')})
parsesichtweite = False
parsewindgeschwindigkeit = False
parseniederschlagsmenge = False
parseniederschlagswahrscheinlichkeit = False
parseschneehoehe = False
for t in get_tags:
    if str(t).find("Sichtweite") > -1:
        parsesichtweite = True
        continue
    if parsesichtweite:
        data['Sichtweite'] = parse_value(t)
        parsesichtweite = False
        continue
    if str(t).find("Windgeschwindigkeit") > -1:
        parsewindgeschwindigkeit = True
        continue
    if parsewindgeschwindigkeit:
        data['Windgeschwindigkeit'] = parse_value(t)
        parsewindgeschwindigkeit = False
        continue
    if str(t).find("Niederschlagsmenge") > -1:
        parseniederschlagsmenge = True
        continue
    if parseniederschlagsmenge:
        data['Niederschlagsmenge'] = parse_value(t)
        parseniederschlagsmenge = False
        continue
    if str(t).find("wahrscheinlichkeit") > -1:
        parseniederschlagswahrscheinlichkeit = True
        continue
    if parseniederschlagswahrscheinlichkeit:
        data['Niederschlags-wahrscheinlichkeit'] = parse_value(t)
        parseniederschlagswahrscheinlichkeit = False
        continue
    if str(t).find("Schneehöhe") > -1:
        parseschneehoehe = True
        continue
    if parseschneehoehe:
        data['Schneehöhe'] = parse_value(t)
        parseschneehoehe = False
        continue

if not 'Schneehöhe' in data:
    data['Schneehöhe'] = '? cm'

for d in data:
    print("%s: %s" % (d, data[d]))

template = open(pubhtml+'_template', 'r')
html = open(pubhtml, 'w')
for line in template.readlines():
     if line.find('###insert_loipe_data###') >= 0:
         continue
     if line.find('###insert_brocken_data###') < 0:
         html.write(line)
     else:
         html.write("""<strong>Wetterdaten Brocken am %(Zeit)s</strong>:
                       Temperatur: <em>%(Temperatur)s</em>;
                       Sichtweite: <em>%(Sichtweite)s</em>;
                       Windgeschwindigkeit: <em>%(Windgeschwindigkeit)s</em>;
                       Schneehöhe: <em>%(Schneehöhe)s</em>;
                       """  % data)

template.close()
html.close()
