"""
Instapush notification service.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/notify.instapush/
"""
import json
import logging

import requests
import voluptuous as vol

import homeassistant.helpers.config_validation as cv
from homeassistant.components.notify import (
    ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA, BaseNotificationService)
from homeassistant.const import CONF_API_KEY


CONF_APP_SECRET = 'app_secret'
CONF_EVENT = 'event'
CONF_TRACKER = 'tracker'

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_API_KEY): cv.string,
    vol.Required(CONF_APP_SECRET): cv.string,
    vol.Required(CONF_EVENT): cv.string,
    vol.Required(CONF_TRACKER): cv.string,
})


_LOGGER = logging.getLogger(__name__)
_RESOURCE = 'https://api.instapush.im/v1/'


def get_service(hass, config):
    """Get the instapush notification service."""
    headers = {'x-instapush-appid': config[CONF_API_KEY],
               'x-instapush-appsecret': config[CONF_APP_SECRET]}

    try:
        response = requests.get(_RESOURCE + 'events/list',
                                headers=headers).json()
    except ValueError:
        _LOGGER.error('Unexpected answer from Instapush API.')
        return None

    if 'error' in response:
        _LOGGER.error(response['msg'])
        return None

    if len([app for app in response
            if app['title'] == config[CONF_EVENT]]) == 0:
        _LOGGER.error(
            "No app match your given value. "
            "Please create an app at https://instapush.im")
        return None

    return InstapushNotificationService(
        config[CONF_API_KEY], config[CONF_APP_SECRET], config[CONF_EVENT],
        config[CONF_TRACKER])


# pylint: disable=too-few-public-methods
class InstapushNotificationService(BaseNotificationService):
    """Implement the notification service for Instapush."""

    def __init__(self, api_key, app_secret, event, tracker):
        """Initialize the service."""
        self._api_key = api_key
        self._app_secret = app_secret
        self._event = event
        self._tracker = tracker
        self._headers = {
            'x-instapush-appid': self._api_key,
            'x-instapush-appsecret': self._app_secret,
            'Content-Type': 'application/json'}

    def send_message(self, message="", **kwargs):
        """Send a message to a user."""
        title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
        data = {"event": self._event,
                "trackers": {self._tracker: title + " : " + message}}

        response = requests.post(_RESOURCE + 'post', data=json.dumps(data),
                                 headers=self._headers)

        if response.json()['status'] == 401:
            _LOGGER.error(
                response.json()['msg'],
                "Please check your details at https://instapush.im/")

@@ -457,16 +457,97 @@
 PI_KEY%0A%0A
+_LOGGER = logging.getLogger(__name__)%0A_RESOURCE = 'https://api.instapush.im/v1/'%0A
 %0ACONF_AP
@@ -617,16 +617,38 @@
 acker'%0A%0A
+DEFAULT_TIMEOUT = 10%0A%0A
 PLATFORM
@@ -864,91 +864,8 @@
 )%0A%0A%0A
-_LOGGER = logging.getLogger(__name__)%0A_RESOURCE = 'https://api.instapush.im/v1/'%0A%0A%0A
 def 
@@ -906,17 +906,17 @@
 Get the 
-i
+I
 nstapush
@@ -1106,16 +1106,43 @@
 sts.get(
+%0A            '%7B%7D%7B%7D'.format(
 _RESOURC
@@ -1142,18 +1142,17 @@
 RESOURCE
- +
+,
  'events
@@ -1161,57 +1161,63 @@
 ist'
-,%0A                                headers=headers
+), headers=headers,%0A            timeout=DEFAULT_TIMEOUT
 ).js
@@ -1532,29 +1532,16 @@
 R.error(
-%0A            
 %22No app 
@@ -1566,16 +1566,26 @@
 alue. %22%0A
+          
         
@@ -1708,25 +1708,29 @@
       config
-%5B
+.get(
 CONF_API_KEY
@@ -1729,25 +1729,25 @@
 _API_KEY
-%5D
+)
 , config
 %5BCONF_AP
@@ -1734,25 +1734,29 @@
 KEY), config
-%5B
+.get(
 CONF_APP_SEC
@@ -1762,18 +1762,30 @@
 CRET
-%5D,
+),%0A       
  config
-%5B
+.get(
 CONF
@@ -1794,26 +1794,22 @@
 VENT
-%5D,%0A       
+),
  config
-%5B
+.get(
 CONF
@@ -1816,17 +1816,17 @@
 _TRACKER
-%5D
+)
 )%0A%0A%0A# py
@@ -1939,16 +1939,24 @@
 mplement
+ation of
  the not
@@ -2568,15 +2568,28 @@
  = %7B
-%22
+%0A            '
 event
-%22
+'
 : se
@@ -2615,21 +2615,17 @@
     
-    %22
+'
 trackers
 %22: %7B
@@ -2620,17 +2620,17 @@
 trackers
-%22
+'
 : %7Bself.
@@ -2651,13 +2651,13 @@
 e + 
-%22 : %22
+' : '
  + m
@@ -2663,16 +2663,25 @@
 message%7D
+%0A        
 %7D%0A%0A     
@@ -2708,16 +2708,43 @@
 ts.post(
+%0A            '%7B%7D%7B%7D'.format(
 _RESOURC
@@ -2748,17 +2748,17 @@
 URCE
- +
+,
  'post'
+)
 , da
@@ -2790,37 +2790,16 @@
         
-                     
 headers=
@@ -2811,16 +2811,41 @@
 _headers
+, timeout=DEFAULT_TIMEOUT
 )%0A%0A     
@@ -2910,33 +2910,16 @@
 R.error(
-%0A                
 response
@@ -2942,32 +2942,42 @@
                 
+          
 %22Please check yo
@@ -2983,39 +2983,25 @@
 our 
-details at https://instapush.im/
+Instapush settings
 %22)%0A

Add timeout (#3304)