# -*- coding: utf-8 -*-
"""
Displays and controls the mute status of the default microphone.

Displays whether the current microphone is muted or not. A click on the icon
will toggle this status. Relies on pulseaudio.

Configuration parameters:
    format_muted: text displayed when muted
        (default FontAwesome)
    format_unmuted: text displayed when unmuted
        (default FontAwesome)

Colors:
    color_mute: when muted
    color_unmute: when unmuted
"""

import subprocess


class NoMicrophone(Exception):
    pass


class Error(Exception):
    pass


class Py3status:
    format_muted = '\uf131'  # FontAwesome
    format_unmuted = '\uf130'  # FontAwesome

    def microphone(self):
        try:
            isMute = self.__getMuteStatus__()
            color = self.py3.COLOR_MUTE if isMute else self.py3.COLOR_UNMUTE
            text = self.format_muted if isMute else self.format_unmuted
            return {
                'full_text': text,
                'color': color,
            }
        except NoMicrophone:
            return {
                'full_text': '',
            }
        except Error:
            return {
                'full_text': '...',
            }

    def __getPaList__(self):
        try:
            paOutput = subprocess.check_output(["pacmd", "list-sources"])
        except subprocess.CalledProcessError:
            raise Error()

        return paOutput.decode()

    def __getMuteStatus__(self):
        try:
            paList = self.__getPaList__()
            fromCurrent = paList[paList.index('* index:'):]
            MUTED_STR = 'muted: '
            fromMutestat = fromCurrent[fromCurrent.index(MUTED_STR)
                                       + len(MUTED_STR):]
            return fromMutestat[:3] == 'yes'
        except ValueError:
            raise NoMicrophone()

    def __toggleMuteStatus__(self):
        try:
            isMuted = self.__getMuteStatus__()
            paList = self.__getPaList__()
            fromCurrent = paList[paList.index('* index: ')+len('* index: '):]
            sourceId = int(fromCurrent[:fromCurrent.index('\n')])
            subprocess.call(['pacmd', 'set-source-mute', str(sourceId),
                             str(int(not isMuted))])
        except ValueError:
            raise NoMicrophone()

    def on_click(self, event):
        self.__toggleMuteStatus__()