"""Use dr.botzo's Dispatch to send mpd notifications."""
import argparse
import getpass
import logging
from select import select
import sys

import mpd
import requests
from requests.auth import HTTPBasicAuth

# set up some basic logging
logger = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

# set up config flags
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--location')
parser.add_argument('-u', '--user')
parser.add_argument('-m', '--mpd-host', default='localhost')
parser.add_argument('-p', '--mpd-port', default=6600)
parser.add_argument('-a', '--mpd-password', action='store_true')
args = parser.parse_args()

if args.user is None or args.location is None:
    print("script needs "
          "-l/--location (url to connect to) -u/--user (user to authenticate to XML-RPC as)")
    sys.exit(2)

password = getpass.getpass("password for {0:s}: ".format(args.user))

auth = HTTPBasicAuth(args.user, password)

client = mpd.MPDClient(use_unicode=True)
client.connect(args.mpd_host, args.mpd_port)

if args.mpd_password:
    mpd_password = getpass.getpass("password for mpd: ")
    client.password(mpd_password)

last_np = ''


def notify_song():
    """React to mpd event, send a now playing dispatch message if relevant."""
    global last_np
    status = client.status()
    logger.debug(status)

    state = status.get('state', None)

    if state == 'play':
        current = client.currentsong()
        logger.debug(current)

        filename = current.get('file', None)

        if filename:
            artist = current.get('artist', "Unknown")
            title = current.get('title', "Unknown")
            album = current.get('album', "Unknown")

            np = "{0:s} - {1:s} [{2:s}]".format(artist, title, album)
            if np != last_np:
                last_np = np
                logger.debug("notifying: {0:s}".format(np))
                payload = {'message': np}
                r = requests.post(args.location, auth=auth, data=payload)
                print(r.json())

notify_song()
# loop forever on mpd events
while True:
    client.send_idle()
    select([client], [], [])
    changed = client.fetch_idle()
    for change in changed:
        if change == 'player':
            notify_song()