#!/usr/bin/python3
""" An audio guestbook for the wedding. """
import os
import time
import random
import logging
import subprocess
from glob import glob
from lib import phone

logger = logging.getLogger(__name__)

BLACK = (0x00, 0x00, 0x00, 0x0a)
RED   = (0xff, 0x00, 0x00, 0x0a)
GREEN = (0x00, 0xff, 0x00, 0x0a)

class Guestbook(phone.Phone):
    recording = None
    service_mode = False
    songs = glob(phone.DIR_SNG + '/*')
    greetings = [phone.DIR_GRE + '/after_the_bark.wav']

    def dialed(self, char):
        logger.debug("Dialed {}.".format(char))
        if char == '0':
            self.service_mode = not self.service_mode
            if self.service_mode:
                self.light.set_to(*RED)
            else:
                self.light.animate()

        # Service mode (operator).
        if self.service_mode:
            if False: pass

            elif char == '1': # Filesystem stats.
                message_count = len(glob(phone.DIR_REC + '/*'))
                space_left = subprocess.run([phone.DIR_BIN + '/space_left'], stdout=subprocess.PIPE).stdout.decode('utf-8').strip()
                self.say("Message count: {}, space left {}.".format(message_count, space_left))

            elif char == '2': # Play back last message.
                filename = self.recording and self.recording.filename
                if filename:
                    self.say("Playing {}.".format(os.path.basename(filename)))
                    self.play(filename)
                else:
                    self.say("No recent recording.")

            elif char == '3': # Play random song.
                self.stop()
                filename = random.choice(self.songs)
                self.say("Playing {}.".format(os.path.basename(filename).split('.')[0]))
                self.play(filename)

            elif char == '4': # For Mike.
                self.stop()
                self.say("Norton is not here right now. Call back later.")

            elif char == 'R': # Shut down.
                self.say("Shutting down.")
                self.light.set_to(0, 0, 0, 0)
                subprocess.run([phone.DIR_BIN + '/shut_down'])

    def handset_up(self):
        logger.debug("Handset up.")
        if self.service_mode:
            time.sleep(0.5)
            self.say("Operator.")
        else:
            self.light.set_to(*GREEN)
            greeting = random.choice(self.greetings)
            time.sleep(1)
            self.play(greeting)
            self.recording = self.record(block=False)

    def handset_down(self):
        logger.debug("Handset down.")
        self.stop()
        if self.recording and self.recording.is_active:
            self.recording.stop()
            self.light.set_to(*BLACK)
        if not self.service_mode:
            self.light.animate()

if __name__ == '__main__':
    import argparse
    ap = argparse.ArgumentParser(description=__doc__)
    ap.add_argument('--debug', action='store_true', dest='debug')
    args = ap.parse_args()
    debug = args.debug

    logging.basicConfig(style='{', format='{asctime}.{msecs:03.0f}Z {levelname} {name}: {message}', datefmt='%Y-%m-%d %H:%M:%S', level=debug and logging.DEBUG or logging.INFO)

    guestbook = Guestbook(debug=debug)
    logger.info("Guestbook started. Dial away.")
    guestbook.run()
