#!/usr/bin/env python3

from i3dstatus.block import Block

from urllib.request import urlopen
from urllib.error import HTTPError, URLError
import os
import asyncio

up_format = ''
down_format = \
        '<span color="red">%site is down (status: %status, %reason)</span>'
interval = 600
sites = []

block = Block(os.path.basename(__file__))


async def show_block(url, status, reason, is_up):
    format_str = up_format if is_up else down_format
    context = {
        'site': url,
        'status': str(status),
        'reason': reason,
    }

    await block.show(format_str, instance=url, markup="pango", context=context)


async def check_http(url):
    print(f'check {url}')
    status = 'n/a'
    reason = ''
    is_up = True
    try:
        resp = urlopen(url)
        status = resp.status
        reason = resp.reason
    except URLError as e:
        reason = e.reason
        is_up = False
    except HTTPError as e:
        status = e.status
        reason = e.reason
        is_up = False

    await show_block(url, status, reason, is_up)


async def main():
    global up_format, down_format, interval

    await block.connect()

    if 'format-up' in block.config:
        up_format = block.config['format-up']

    if 'format-down' in block.config:
        down_format = block.config['format-down']

    if 'interval' in block.config:
        interval = block.config['interval']

    if 'sites' in block.config:
        sites = block.config['sites']

    while True:
        await asyncio.gather(*(check_http(site) for site in sites))
        await asyncio.sleep(interval)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
