import json
import requests

from platypush.config import Config
from platypush.message import Message
from platypush.plugins import Plugin, action


class AutoremotePlugin(Plugin):
    """
    This plugin allows you to send messages and notifications to an
    Android device that runs AutoRemote (https://joaoapps.com/autoremote/).
    You can also build custom actions to run on your Android device upon
    AutoRemote events using Tasker (https://tasker.joaoapps.com/).
    """

    _AUTOREMOTE_BASE_URL = 'https://autoremotejoaomgcd.appspot.com'
    _AUTOREMOTE_MESSAGE_URL = _AUTOREMOTE_BASE_URL + '/sendmessage'
    _AUTOREMOTE_NOTIFICATION_URL = _AUTOREMOTE_BASE_URL + '/sendnotification'

    def __init__(self, key, password=None, *args, **kwargs):
        """
        :param key: The key associated to your device. Open the link in your AutoRemote app and copy the key in the target URL
        :type key: str

        :param password: AutoRemote password configured on the device (default: None)
        :type password: str
        """

        super().__init__(*args, **kwargs)
        self.key = key
        self.password = password

    @action
    def send_message(self, msg, key=None, password=None, target=None,
                     sender=None, ttl=None, group=None, *args, **kwargs):
        """
        Sends a message to AutoRemote.

        :param msg: Message to send

        :param key: Set it if you want to override the default key (default: None)
        :type key: str

        :param password: Set it if you want to override the default password (default: None)
        :type password: str

        :param target: Message target (default: None)
        :type target: str

        :param sender: Message sender (default: None)
        :type target: str

        :param ttl: Message time-to-live in seconds (default: None)
        :type ttl: int

        :param group: Message group name (default: None)
        :type group: str
        """

        args = {
            'message': msg,
            'key': key or self.key,
            'sender': sender or Config.get('device_id'),
        }

        if password or self.password:
            args['password'] = password or self.password

        if target: args['target'] = target
        if ttl: args['ttl'] = ttl
        if group: args['collapseKey'] = group

        response = requests.post(self._AUTOREMOTE_MESSAGE_URL, data=args)
        self.logger.info('Received response from AutoRemote: {}'.format(response.text))

    @action
    def send_notification(self, text=None, key=None, password=None, title=None,
                          target=None, sender=None, ttl=None, group=None,
                          sound=None, vibration=None, url=None, id=None,
                          action=None, icon=None, led=None, ledon=None,
                          ledoff=None, picture=None, share=False, msg=None,
                          action1=None, action1_name=None, action1_icon=None,
                          action2=None, action2_name=None, action2_icon=None,
                          action3=None, action3_name=None, action3_icon=None,
                          persistent=False, statusbar_icon=None, ticker=None,
                          dismiss_on_touch=False, priority=0, number=None,
                          content_info=None, subtext=None, max_progress=None,
                          progress=None, indeterminate_progress=False,
                          action_on_dismiss=None, cancel=False, *args, **kwargs):
        """
        Sends a notification to AutoRemote. Click on your AutoRemote URL ->
        Send Notification for a detailed explanation of the attributes.
        """

        args = {
            'text': text,
            'key': key or self.key,
            'sender': sender or Config.get('device_id'),
        }

        if password or self.password:
            args['password'] = password or self.password

        if target: args['target'] = target
        if ttl: args['ttl'] = ttl
        if group: args['collapseKey'] = group
        if title: args['title'] = title
        if text: args['text'] = text
        if sound: args['sound'] = sound
        if vibration: args['vibration'] = vibration
        if url: args['url'] = url
        if id: args['id'] = id
        if action: args['action'] = action
        if icon: args['icon'] = icon
        if led: args['led'] = led
        if ledon: args['ledon'] = ledon
        if ledoff: args['ledoff'] = ledoff
        if picture: args['picture'] = picture
        if msg: args['message'] = msg
        if share: args['share'] = share
        if action1: args['action1'] = action1
        if action1_name: args['action1name'] = action1_name
        if action1_icon: args['action1icon'] = action1_icon
        if action2: args['action2'] = action2
        if action2_name: args['action2name'] = action2_name
        if action2_icon: args['action2icon'] = action2_icon
        if action3: args['action3'] = action3
        if action3_name: args['action3name'] = action3_name
        if action3_icon: args['action3icon'] = action3_icon
        if persistent: args['persistent'] = persistent
        if statusbar_icon: args['statusbaricon'] = statusbar_icon
        if ticker: args['ticker'] = ticker
        if dismiss_on_touch: args['dismissontouch'] = dismiss_on_touch
        if priority: args['priority'] = priority
        if number: args['number'] = number
        if content_info: args['contentinfo'] = content_info
        if subtext: args['subtext'] = subtext
        if max_progress: args['maxprogress'] = max_progress
        if progress: args['progress'] = progress
        if indeterminate_progress: args['indeterminateprogress'] = indeterminate_progress
        if action_on_dismiss: args['actionondismiss'] = action_on_dismiss
        if cancel: args['cancel'] = cancel

        response = requests.post(self._AUTOREMOTE_NOTIFICATION_URL, data=args)
        self.logger.info('Received response from AutoRemote: {}'.format(response.text))


# vim:sw=4:ts=4:et: