#!/usr/bin/env python3

from json import load
from sys import exit

from requests import get

with open('/etc/icinga2/notification_config.json') as f:
    CONFIG = load(f)

try:
    r = get(
        'https://api.sipgate.com/v2/balance',
        auth=(CONFIG['sipgate']['user'], CONFIG['sipgate']['password']),
        headers={'Accept': 'application/json'},
    )

    if r.status_code == 401:
        # Status code 401 means our login data is wrong. Since we're
        # using the same login data in icinga_notification_wrapper, we
        # won't be able to send SMS either. This should *not* result in
        # this check going UNKNOWN.
        print('CRITICAL: Getting the account balance failed with status code 401!')
        exit(2)
    else:
        r.raise_for_status()
except Exception as e:
    print(repr(e))
    exit(3)

# No, we can't combine those two try..except blocks, because a connection
# error means the check is UNKNOWN, but a parsing error is CRITICAL.
try:
    json = r.json()
    money = json['amount']/10000

    if money < 2:
        print('CRITICAL: Only {} {} left in account!'.format(money, json['currency']))
        exit(2)
    elif money < 3:
        print('WARNING: Only {} {} left in account!'.format(money, json['currency']))
        exit(1)
    else:
        print('Account holds {} {}.'.format(money, json['currency']))
        exit(0)
except Exception as e:
    # API changed, returned malformed JSON or whatever. This is an error.
    print(repr(e))
    exit(2)
