#
#  engine
#
#  Playout Daemon for autoradio project
#
#
#  Copyright (C) 2017-2018 Gottfried Gaisbauer <gottfried.gaisbauer@servus.at>
#
#  This file is part of engine.
#
#  engine is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  any later version.
#
#  engine is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with engine. If not, see <http://www.gnu.org/licenses/>.
#

from modules.communication.liquidsoap.client import LiquidSoapClient


class LiquidSoapPlayerClient(LiquidSoapClient):

    # ------------------------------------------------------------------------------------------ #
    def mixer(self, command, *args):
        if command == "status":
            return self.mixerstatus(*args)

        if command == "inputs":
            return self.mixerinputs()

        if command == "volume":
            return self.mixervolume(*args)

        if command == "select":
            if len(args) == 2:
                return self.mixerselect(args[0], args[1])

        return "LiquidSoapPlayerClient does not understand mixer."+command+str(args)

    # ------------------------------------------------------------------------------------------ #
    def recorder(self, num, command, *args):
        if command == "status":
            return self.recorderstatus(num)

        if command == "start":
            return self.recorderstart(num)

        if command == "stop":
            return self.recorderstop(num)

        return "LiquidSoapPlayerClient does not understand mixer." + command + str(args)

    # ------------------------------------------------------------------------------------------ #
    def http(self, command, *args):
        if command == "url":
            return self.set_http_url(*args)

        return "LiquidSoapPlayerClient does not understand http." + command + str(args)

    # ------------------------------------------------------------------------------------------ #
    def fs(self, command, *args):
        if command == "push":
            return self.fs_push(*args)

        return "LiquidSoapPlayerClient does not understand fs." + command + str(args)

    # ------------------------------------------------------------------------------------------ #
    def auraengine(self, command, *args):
        if command == "state":
            return self.auraengine_state()

        return "LiquidSoapPlayerClient does not understand auraengine." + command + str(args)

    # ------------------------------------------------------------------------------------------ #
    def auraengine_state(self):
        self.command('auraengine', 'state')
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def fs_push(self, uri):
        self.command('fs', 'push', uri)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def set_http_url(self, uri):
        self.command('http', 'url', uri)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def mixerinputs(self):
        # send command
        self.command("mixer", "inputs")

        # convert to list and return it
        return self.message.strip().split(' ')

    # ------------------------------------------------------------------------------------------ #
    def mixerstatus(self, pos=""):
        """
        Get state of a source in the mixer
        @type    pos:       string
        @param   pos:       Mixerposition
        @rtype:  string
        @return: Response from LiquidSoap
        """
        self.command("mixer", "status", str(pos))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def mixerselect(self, pos, activate):
        """
        Kanal/Source aktivieren
        @type    pos:       string
        @param   pos:       Die Position
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command("mixer", "select", str(pos) + " " + str(activate).lower())
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def mixervolume(self, pos, volume):
        """
        set channel volume
        :param pos:
        :param volume:
        :return:
        """
        self.command("mixer", "volume", str(pos) + " " + str(volume))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def recorderstatus(self, num):
        """
        get status of a recorder
        :return:
        """
        self.command("recorder_" + str(num), "status")
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def recorderstart(self, num):
        """
        get status of a recorder
        :return:
        """
        self.command("recorder_" + str(num), "start")
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def recorderstop(self, num):
        """
        get status of a recorder
        :return:
        """
        self.command("recorder_" + str(num), "stop")
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def skip(self, namespace="playlist", pos=""):
        """
        Source skippen
        @type    namespace: string
        @param   namespace: Namespace der Source
        @type    pos:       string
        @param   pos:       Die Position - optional - Position des Channels vom Mixer benötigt
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('skip', namespace, pos)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def remove(self, pos, namespace="playlist"):
        """
        Track  aus der secondary_queue oder der Playlist entfernen
        @type    pos:       string
        @param   pos:       Die Position
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('remove', namespace, str(pos))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def insert(self, uri, pos='0', namespace="playlist"):
        """
        Track  einfügen
        @type    uri:       string
        @param   uri:       Uri einer Audiodatei
        @type    pos:       string
        @param   pos:       Die Position
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('insert', namespace, str(pos) + ' ' + uri)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def move(self, fromPos, toPos, namespace="playlist"):
        """
        Track  von Position fromPos nach Position toPos verschieben
        @type    fromPos:   string/int
        @param   fromPos:   Position des zu verschiebenden Tracks
        @type    toPos:     string
        @param   toPos:     Die Position zu der verschoben werden soll
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('move', namespace, str(fromPos) + ' ' + str(toPos))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def play(self, namespace="playlist"):
        """
        Source abspielen - funktioniert nur bei Playlist
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('play', namespace)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def pause(self, namespace="playlist"):
        """
        Source pausieren/stoppen - funktioniert nur bei Playlist
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('pause', namespace)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def flush(self, namespace="playlist"):
        """
        Playlist leeren
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('flush', namespace)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def playlistData(self):
        """
        Metadaten der Playlist ausgeben
        @rtype:  string
        @return: Ein Json-String
        """
        self.command('data', 'playlist')
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def seek(self, duration, namespace="playlist"):
        """
        Aktuell laufenen Track des Kanals vorspulen
        @type    duration:  string/int
        @param   duration:  Dauer in Sekunden
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('seek', namespace, str(duration))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def get_queue(self, namespace="ch1", queue='queue'):
        """
        Queue eines Kanals ausgeben
        @type    namespace: string
        @param   namespace: Namespace der Source
        @type    queue:     string
        @param   queue:    Name des queues (queue, primary_queue, secondary_queue)
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command(queue, namespace)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def loadPlaylist(self, uri, params="", namespace="playlist"):
        """
        Playlist laden
        @type    uri:       string
        @param   uri:       Uri einer Playlist im XSPF-Format
        @type    params:    string
        @param   params:    obsolete
        @type    namespace: string
        @param   namespace: Namespace der Source - hier nur playlist
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('load', namespace, uri + params)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def currentTrack(self, namespace="request"):
        """
        Das oder die ID(s) der gerade abgespielten requests erhalten
        @type    namespace: string
        @param   namespace: Namespace der Source
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers (als String)
        """
        self.command('on_air', namespace)
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def volume(self, pos, volume, namespace="mixer"):
        """
        Lautstärke eines Kanals setzen
        @type    pos:       int/string
        @param   pos:       Die Position/ Nummer des Kanals (playlist=0)
        @type    volume:    int/string
        @param   volume:    Zahl von 1 -100
        @type    namespace: string
        @param   namespace: Namespace der Source (immer mixer)
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('volume', namespace, str(pos) + ' ' + str(volume))
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def playlist_remaining(self):
        """
        Wie lange läuft der aktuelle Track der Playlist noch
        @rtype:  string
        @return: Die Antwort des Liquidsoap-Servers
        """
        self.command('remaining', 'playlist')
        return self.message

    # ------------------------------------------------------------------------------------------ #
    def list_channels(self):
        """
        Channels auflisten (Simple JSON)
        """
        # Liquidsoap Kommando

        channels = self.sendLqcCommand(self.lqc, 'mixer', 'inputs')

        if not isinstance(channels, list):
            self.error('02')
        elif len(channels) < 1:
            self.warning('01')
        else:
            self.success('00', channels)

        self.notifyClient()