#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# FUNTION TO PROCESS THEATRE SCRIPT
import re
from instructions import characters
from instructions import directions


def read_script(filename):
    lines = []

    with open(filename, 'r') as f:
        for line in f.readlines():
            #print(line) 
            parts = re.match(r'(?P<character>^.+?):\s?(\[(?P<stage_directions>[^]]+)\])?\s?(?P<text>.*)', line)
            parts_character = parts.group('character')
            parts_text = parts.group('text')
            parts_directions = str(parts.group('stage_directions')).split(".")

            lines.append((parts_character,parts_text,parts_directions))

        #print(lines)
    return lines;


# FUNCTION TO SYNTHESIZE TEXT
# based on https://github.com/marytts/marytts-txt2wav/tree/python

# To play wave files
from subprocess import call

# Mary server informations
mary_host = "localhost"
mary_port = "59125"

# HTTP + URL packages
import httplib2
from urllib.parse import urlencode, quote # For URL creation

def tts(voice, input_text, speaker):
    # Build the query
    query_hash = {"INPUT_TEXT": input_text,
                "INPUT_TYPE":"TEXT", # Input text
                "LOCALE":"en_GB",
                "VOICE": voice, # Voice informations  (need to be compatible)
                "OUTPUT_TYPE":"AUDIO",
                "AUDIO":"WAVE", # Audio informations (need both)
                }
    query = urlencode(query_hash)
    print("query = \"http://%s:%s/process?%s\"" % (mary_host, mary_port, query))

    # Run the query to mary http server
    h_mary = httplib2.Http()
    resp, content = h_mary.request("http://%s:%s/process?" % (mary_host, mary_port), "POST", query)

    #  Decode the wav file or raise an exception if no wav files
    if (resp["content-type"] == "audio/x-wav"):

        # Write the wav file
        f = open("/tmp/output_wav.wav", "wb")
        f.write(content)
        f.close()

        # Play the wav file
        # output = sc.get_speaker('Scarlett')
        # a = read("/tmp/output_wav.wav")
        # data = numpy.array(a[1],dtype=float)
        # print(data)
        # with sc.get_speaker('Scarlett').player(a[0], channels=[0]) as speaker:
        #     speaker.play(data)

        # aplay -D mono3 /tmp/output_wav.wav

        call(["aplay", "-D", speaker, "/tmp/output_wav.wav"])

        #pygame.mixer.init(frequency=16000) # Initialise the mixer
        #s = pygame.mixer.Sound("/tmp/output_wav.wav")
        #s.play()
        #pygame.time.wait(int(math.ceil(s.get_length() * 1000)))

    else:
        raise Exception(content)


# Fuction to RUN THE PLAY
import paho.mqtt.client as mqtt
import json
from time import sleep

HOST = 'localhost'
PORT = 1883


def on_connect(client, userdata, flags, rc):
    print("Connected to {0} with result code {1}".format(HOST, rc))
    # Subscribe to the text detected topic
    client.subscribe("hermes/asr/textCaptured")
    client.subscribe("hermes/dialogueManager/sessionQueued")


def on_message(client, userdata, msg):
    print('Google Home is not speaking anymore')
    client.connected_flag=True

def on_waiting(client, userdata, msg):
    sessionId = json.loads(id.payload)
    print('delete mistaken intent')
    client.publish("hermes/dialogueManager/endSession", json.dumps({
		'sessionId': sessionId,
	    }))

client = mqtt.Client()
client.connect(HOST, PORT, 60)
client.on_connect = on_connect
client.connected_flag=False

listening = False



for character, line, direction in read_script('plays/demo_act.txt'):
    input_text = line
    voice = characters.get(character)[0]
    speaker = characters.get(character)[1]
    #speaker = 'default'
    # Some way to do something with the stage directions will come here
    action = directions.get(direction[0])
    tts(voice, input_text, speaker)

    if action == 5:
        print('Waiting for the Google Home to finish its talk')

        # # start voice activity detection
        # client.publish("hermes/asr/startListening", json.dumps({
		# 'siteId': 'default',
		# 'init': {
		# 	'type': 'action',
		# 	'canBeEnqueued': True
		# }
	    # }))

        client.publish("hermes/asr/startListening", json.dumps({
		'siteId': 'default'
	    }))

        # create callback
        client.on_message = on_message
        listening = True

        while listening:
            client.loop()

            #client.on_message = on_message
            client.message_callback_add('hermes/asr/textCaptured', on_message)

            if client.connected_flag:
                sleep(1)
                print('Continue the play')
                client.connected_flag = False
                client.message_callback_add('hermes/dialogueManager/sessionQueued', on_waiting)
                break

    if action == 4:
        print('play audioclip')
        playing = True

        while playing:
            call(["aplay", "-D", speaker, "/usr/share/snips/congress.wav"])
            playing = False
            



    sleep(1)


print('The play is over.')
