#!/usr/bin/env python3
import json
import os
from subprocess import Popen, PIPE, check_output, check_call

import yaml


station_name_file = '/run/user/%s/rofi-radio-name' % os.getuid()

def mpv_ipc(*args):
    try:
        j = json.loads(check_output(['mpv-ipc'] + list(args)))
        if j:
            return j['data']
    except:
        pass
    return ''

with open(os.path.expanduser("~/.local/share/rofi-radio/playlists.yaml")) as f:
    stations = yaml.load(f)

rofi_command = ['rofi', '-i', '-selected-row', '0', '-dmenu', '-p', 'mpv']

current_song = mpv_ipc('get_property_string', 'media-title')
if current_song:
    try:
        with open(station_name_file) as f:
            station_name = f.readline()
    except:
        station_name = ''
    rofi_command += ['-mesg', station_name]
    commands = b"Play/Pause\nStop\nShuffle\nNext\nPrevious"

else:
    commands = bytes('\n'.join([s["name"] for s in stations]), 'utf8')

rofi = Popen(rofi_command, stdout=PIPE, stdin=PIPE)
choice = rofi.communicate(input=commands)[0].decode('utf8').rstrip()

if current_song:
    if choice == "Play/Pause":
        mpv_ipc('cycle', 'pause')
    elif choice == "Stop":
        mpv_ipc('stop')
    elif choice == "Shuffle":
        mpv_ipc('playlist-shuffle')
    elif choice == "Next":
        mpv_ipc('playlist-next')
    elif choice == "Previous":
        mpv_ipc('playlist-prev')
else:
    s = [s for s in stations if s["name"] == choice]
    if s:
        # Load the selected playlist
        loc = s[0]["loc"]
        station_name = s[0]["name"]
        if loc.startswith('http') or loc.startswith('ytdl'):
            # Load the url
            mpv_ipc('loadfile', loc)
        else:
            # Load the file
            workdir = mpv_ipc('get_property_string', 'working-directory')
            mpv_ipc('loadfile', os.path.expanduser(loc))
            station_name = loc
        with open(station_name_file, 'w') as f:
            f.write(station_name)
    else:
        # Try to load the user input
        mpv_ipc('loadfile', choice)
    mpv_ipc('set_property_string', 'pause', 'no')


# force update of i3status
check_call(['killall', '-USR1', 'i3status'])