#!/usr/bin/env python3

import xmltodict
import urllib
import datetime
import json
import collections

# BOM Weather XML URL for my area:
#
# see http://www.bom.gov.au/catalogue/data-feeds.shtml
# Adjust aac for your forecast region and the URL as required.

aac = "NSW_PT254";
bom_url = "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN11060.xml";

bom_icons = {
    '1': 'SUNNY.JPG',
    '2': 'CLEAR.JPG',
    '3': 'PCLOUD.JPG',
    '4': 'CLOUDY.JPG',
    '6': 'HAZE.JPG',
    '8': 'LRAIN.JPG',
    '9': 'WIND.JPG',
    '10': 'FOG.JPG',
    '11': 'SHOWER.JPG',
    '12': 'RAIN.JPG',
    '13': 'DUST.JPG',
    '14': 'FROST.JPG',
    '15': 'SNOW.JPG',
    '16': 'STORM.JPG',
    '17': 'LSHOWE.JPG',
    '18': 'HSHOWE.JPG',
    '19': 'CYCLON.JPG'
}


content = urllib.request.urlopen(bom_url)
xmldict = xmltodict.parse(content.read())
belco = [a for a in xmldict['product']['forecast']['area'] if a['@aac'] == aac][0]

new = {}

#current = a['forecast-period'][0]
weather = {}

# The first forecast period doesn't always have the temperature and other bits
# I get the overnight low and forecast to substitute when this happens.

if (type(belco['forecast-period'][0]['element']) == type(collections.OrderedDict())):
    night = 1
else:
    night = 0

weather['today'] = belco['forecast-period'][0]
weather['tomorrow'] = belco['forecast-period'][1]
weather['day_after'] = belco['forecast-period'][2]


if night:
    for day in weather.keys():
        new[day] = {}
        if (day == 'today'):
            new[day]['day'] = 'Tonight'
            new[day]['max'] = [a for a in weather['tomorrow']['element'] if a['@type'] == 'air_temperature_minimum'][0]['#text']
            new[day]['icon'] = bom_icons[weather['today']['element']['#text']]
            #bom_icons[[a for a in weather['tomorrow']['element'] if a['@type'] == 'forecast_icon_code'][0]['#text']]
        else:
            new[day]['day'] = datetime.datetime.strptime(weather[day]['@start-time-local'], "%Y-%m-%dT%H:%M:%S%z").strftime("%A")
            for el in weather[day]['element']:
                if type(el) == type(collections.OrderedDict()):
                    if el['@type'] == "forecast_icon_code":
                        new[day]['icon'] = bom_icons[el['#text']]
                    elif el['@type'] == 'air_temperature_maximum':
                        new[day]['max'] = el['#text']

else:

    for day in weather.keys():
        new[day] = {}
        new[day]['day'] = datetime.datetime.strptime(weather[day]['@start-time-local'], "%Y-%m-%dT%H:%M:%S%z").strftime("%A")
    
        for el in weather[day]['element']:
            if type(el) == type(collections.OrderedDict()):
                if el['@type'] == "forecast_icon_code":
                    new[day]['icon'] = bom_icons[el['#text']]
                elif el['@type'] == 'air_temperature_maximum':
                    new[day]['max'] = el['#text']
                    
                    
with open('bom.json', 'w') as output:
    output.write(json.dumps(new))
    output.close()
