# pylint: disable=C0111,R0903

"""Display HTTP status code

Parameters:
    * http__status.label: Prefix label (optional)
    * http__status.target: Target to retrieve the HTTP status from
    * http__status.expect: Expected HTTP status
"""

from requests import head

import psutil

import core.module
import core.widget
import core.decorators

class Module(core.module.Module):
    UNK = 'UNK'

    @core.decorators.every(seconds=30)
    def __init__(self, config, theme):
        super().__init__(config, theme, core.widget.Widget(self.output))

        self.__label = self.parameter('label')
        self.__target = self.parameter('target')
        self.__expect = self.parameter('expect', '200')

    def labelize(self, s):
        if self.__label is None:
            return s
        return '{}: {}'.format(self.__label, s)

    def getStatus(self):
        try:
            res = head(self.__target)
        except Exception as e:
            print(e)
            return self.UNK
        else:
            status = str(res.status_code)
            return status

    def getOutput(self):
        if self.__status == self.__expect:
            return self.labelize(self.__status)
        else:
            reason = ' != {}'.format(self.__expect)
            return self.labelize('{}{}'.format(self.__status, reason))

    def output(self, widget):
        return self.__output

    def update(self):
        self.__status = self.getStatus()
        self.__output = self.getOutput()

    def state(self, widget):
        if self.__status == self.UNK:
            return 'warning'
        if self.__status != self.__expect:
            return 'critical'
        return self.__output

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4