import logging
import os

import requests
from alerta.plugins import PluginBase

try:
    from alerta.plugins import app  # alerta >= 5.0
except ImportError:
    from alerta.app import app  # alerta < 5.0

LOG = logging.getLogger('alerta.plugins.goalert')
LOG.info('Initializing')

GOALERT_URL = os.environ.get('GOALERT_URL') or app.config['GOALERT_URL']
GOALERT_TOKEN = os.environ.get('GOALERT_TOKEN') or app.config['GOALERT_TOKEN']
GOALERT_VERIFY = os.environ.get(
    'GOALERT_VERIFY') or app.config['GOALERT_VERIFY']
DASHBOARD_URL = os.environ.get('DASHBOARD_URL') or app.config['DASHBOARD_URL']


class TriggerEvent(PluginBase):

    def goalerts_endpoint(self):
        return '{}{}'.format(GOALERT_URL, '/api/v2/generic/incoming')

    def goalert_close_alert(self, alert, why):
        closeUrl = self.goalerts_endpoint()

        json = {
            'token': GOALERT_TOKEN,
            'dedup': alert.id,
            'action': 'close',
            'details': why
        }
        LOG.debug('goalert close {}: {} {}'.format(why, alert.id, closeUrl))

        try:
            r = requests.post(closeUrl, json, timeout=2, verify=GOALERT_VERIFY)
        except Exception as e:
            raise RuntimeError('goalert connection error: %s' % e)
        return r

    # def goalert_ack_alert(self, alert, why):

    #     ackUrl = goalert_EVENTS_ACK_URL % alert.id
    #     LOG.debug('goalert ack %s: %s %s' % (why, alert.id, ackUrl))

    #     try:
    #         r = requests.post(ackUrl, json={}, headers=headers, timeout=2)
    #     except Exception as e:
    #         raise RuntimeError("goalert connection error: %s" % e)
    #     return r

    def pre_receive(self, alert):
        return alert

    def post_receive(self, alert):
        LOG.debug('Alert receive %s: %s' %
                  (alert.id, alert.get_body(history=False)))
        if alert.repeat:
            LOG.debug('Alert repeating; ignored')
            return

        if (alert.severity in ['cleared', 'normal', 'ok']) or (alert.status == 'closed'):
            r = self.goalert_close_alert(alert, 'CREATE-CLOSE')
        else:
            # body = alert.get_body(history=False)
            json = {
                'token': GOALERT_TOKEN,
                'dedup': alert.id,
                'summary': alert.resource,
                'details': '[{}] {}: {}'.format(alert.environment, alert.resource, alert.value)
            }
            LOG.debug('goalert CREATE payload: %s' % json)
            endpoint = self.goalerts_endpoint()

            try:
                r = requests.post(endpoint, json, timeout=2,
                                  verify=GOALERT_VERIFY)
            except Exception as e:
                raise RuntimeError('goalert connection error: %s' % e)

            LOG.debug('goalert response: {} - {}'.format(r.status_code, r.text))

    def status_change(self, alert, status, text):
        LOG.debug('Alert change %s to %s: %s' %
                  (alert.id, status, alert.get_body(history=False)))

        if status not in ['ack', 'assign', 'closed', 'expired']:
            LOG.debug('Not sending status change to goalert: %s to %s' %
                      (alert.id, status))
            return

        if status == 'closed':
            r = self.goalert_close_alert(alert, 'STATUS-CLOSE')
        elif status == 'expired':
            r = self.goalert_close_alert(alert, 'STATUS-EXPIRED')
        # elif status == 'ack':
        #     r = self.goalert_ack_alert(alert, 'STATUS-ACK')

        LOG.debug('goalert response: {} - {}'.format(r.status_code, r.text))
