#!/usr/bin/python
from easy_pipes import Monitor, InputEvent
import os
import time
import evdev
import random
import tinytag
import subprocess
from subprocess import DEVNULL, PIPE
from glob import glob
import logging

logger = logging.getLogger(__name__)

DIR_MEDIA = '/home/mitch/media/'
DIR_KEYS  = DIR_MEDIA + 'keys/'
DIR_MUSIC = DIR_MEDIA + 'music/'
DIR_MESSAGES = DIR_MEDIA + 'messages/'

KEY_1 =  2
KEY_2 =  3
KEY_3 =  4
KEY_4 =  5
KEY_5 =  6
KEY_6 =  7
KEY_7 =  8
KEY_8 =  9
KEY_9 =  10
KEY_0 =  11
KEY_KPASTERISK = 55
KEY_R = 19

char_by_key = {
    KEY_1: '1',
    KEY_2: '2',
    KEY_3: '3',
    KEY_4: '4',
    KEY_5: '5',
    KEY_6: '6',
    KEY_7: '7',
    KEY_8: '8',
    KEY_9: '9',
    KEY_0: '0',
    KEY_KPASTERISK: '*',
    KEY_R: 'R',
    }

def say(text, voice='english-us', block=True):
    wav_file = '/tmp/{}.wav'.format(time.time())
    subprocess.run(['espeak', '-v', voice, '-w', wav_file, text], stdout=DEVNULL, stderr=DEVNULL)
    p = subprocess.Popen(['aplay', wav_file], stdout=DEVNULL, stderr=DEVNULL)
    logger.debug("Saying: {}".format(text))
    if block:
        p.wait()
    else:
        return p

def record(filename):
    logger.info("Recording {}.".format(filename))
    arecord = subprocess.Popen(['arecord', '-f', 'S16_LE', '-r', '44100'], stderr=DEVNULL, stdout=PIPE)
    ffmpeg = subprocess.Popen(['ffmpeg', '-i', '-', filename], stdin=arecord.stdout, stdout=DEVNULL, stderr=DEVNULL)
    return arecord

class Dialer(InputEvent):
    def handle_message(self, message):
        ctx = self.ctx
        if message.type == 1 and message.value == 1:
            key = message.code
            char = char_by_key[key]
            logger.info("dialer: {} pressed.".format(char))
            say("You dialed {}.".format(char), block=False)

class Hook(InputEvent):
    def handle_message(self, message):
        ctx = self.ctx
        if message.type == 1:
            logger.debug("hook: {}".format(message.value))
            if message.value == 0:
                # Picked up.
                time.sleep(1)
                say("Ree cord your message now!", block=True)
                message_filenames = glob(DIR_MESSAGES + '*')
                if not message_filenames:
                    message_id = 0
                else:
                    message_id = max(int(os.path.basename(f).split('.')[0]) for f in message_filenames) + 1
                message_filename = DIR_MESSAGES + '{:03d}.mp3'.format(message_id)
                self.recording = record(message_filename)

            elif message.value == 1:
                # Hung up.
                if self.recording:
                    logger.info("Ending message recording.")
                    self.recording.terminate()

if __name__ == '__main__':
    logging.basicConfig(style='{', level=logging.DEBUG, format='{asctime}.{msecs:0.0f}Z {levelname} {funcName}: {message}', datefmt='%Y-%m-%d %H:%M:%S')
    logging.getLogger('easy_pipes').setLevel(logging.INFO)

    logger.info("Starting up.")
    logger.info([evdev.InputDevice(d) for d in evdev.list_devices()])
    Monitor(
        Hook("/dev/input/event0"),
        Dialer("/dev/input/event1"),
        context=dict(
            song=None,
            ),
        ).monitor()
