"""
This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
The Intent Schema, Custom Slots, and Sample Utterances for this skill, as well
as testing instructions are located at http://amzn.to/1LzFrj6

For additional samples, visit the Alexa Skills Kit Getting Started guide at
http://amzn.to/1LGWsLG
"""

from __future__ import print_function
from twilio.rest import TwilioRestClient

#APPID = '' # enter your APPID from openweather API here
accountSID = ''
authToken = ''
twilioCli = TwilioRestClient(accountSID, authToken)
myTwilionumber = ''

CONTACTS_LIST = { 'Adam': '', 
                  'John': '+',
                }

# TO DO :
# IMPORT TWILIO
# ADD CONTACTS TO LIST IN SESSION ATTRIBUTES


def lambda_handler(event, context):
    """ Route the incoming request based on type (LaunchRequest, IntentRequest,
    etc.) The JSON body of the request is provided in the event parameter.
    """
    print("event.session.application.applicationId=" +
          event['session']['application']['applicationId'])

    """
    Uncomment this if statement and populate with your skill's application ID to
    prevent someone else from configuring a skill that sends requests to this
    function.
    """
    # if (event['session']['application']['applicationId'] !=
    #         "amzn1.echo-sdk-ams.app.[unique-value-here]"):
    #     raise ValueError("Invalid Application ID")

    if event['session']['new']:
        on_session_started({'requestId': event['request']['requestId']},
                           event['session'])

    if event['request']['type'] == "LaunchRequest":
        return on_launch(event['request'], event['session'])
    elif event['request']['type'] == "IntentRequest":
        return on_intent(event['request'], event['session'])
    elif event['request']['type'] == "SessionEndedRequest":
        return on_session_ended(event['request'], event['session'])


def on_session_started(session_started_request, session):
    """ Called when the session starts """

    print("on_session_started requestId=" + session_started_request['requestId']
          + ", sessionId=" + session['sessionId'])


def on_launch(launch_request, session):
    """ Called when the user launches the skill without specifying what they
    want
    """

    print("on_launch requestId=" + launch_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # Dispatch to your skill's launch
    return get_welcome_response()


def on_intent(intent_request, session):
    """ Called when the user specifies an intent for this skill """

    print("on_intent requestId=" + intent_request['requestId'] +
          ", sessionId=" + session['sessionId'])

    intent = intent_request['intent']
    intent_name = intent_request['intent']['name']

    # Dispatch to your skill's intent handlers
    if intent_name == "sendTextToContactIntent":
        return sendText_in_session(intent, session)
    elif intent_name == "WhatsMyContactsListIntent":
        return get_contactList_from_session(intent, session)
    elif intent_name == "AMAZON.HelpIntent":
        return get_welcome_response()
    else:
        raise ValueError("Invalid intent")


def on_session_ended(session_ended_request, session):
    """ Called when the user ends the session.

    Is not called when the skill returns should_end_session=true
    """
    print("on_session_ended requestId=" + session_ended_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # add cleanup logic here

# --------------- Functions that control the skill's behavior ------------------


def get_welcome_response():
    """ If we wanted to initialize the session to have some attributes we could
    add those here
    """

    session_attributes = {}
    card_title = "Welcome"
    speech_output = "Welcome to the text sender. View your contact list by saying something like who can i text. \
                You can ask me to send a text to someone on your contact list by saying send a text to contact x saying y"
    # If the user either does not reply to the welcome message or says something
    # that is not understood, they will be prompted again with this text.
    reprompt_text = "I didn't understand what you said, please try asking who is on my contact list."
    should_end_session = False
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))


def sendText_in_session(intent, session):
    """ sends a Text with the Twilio API in the session and prepares the speech to reply to the
    user.
    """
    print("ATTEMPTING TO SENDTEXT_IN_SESSION")
    intentTitle = intent['name']
    session_attributes = {}
    should_end_session = True

    if 'Contact' in intent['slots'] and 'Message' in intent['slots'] :
        print("VALIDATED INPUT FOR SENDING TEXT")
        
        Contact = intent['slots']['Contact']['value']
        Message_Content = intent['slots']['Message']['value']
        Contact_cellphone = CONTACTS_LIST[Contact]
        message = twilioCli.messages.create(body=Message_Content,from_=myTwilionumber, to=Contact_cellphone)
        # ALLOWS FOR STATEFUL PROCESSING
        # session_attributes = create_favorite_color_attributes(favorite_color)
        speech_output = "I have sent a text to " + \
                        Contact + " that says " + Message_Content + \
                        ". Goodbye. "
        reprompt_text = "You can ask me to send a text to someone on your contact list by saying send a text to contact saying."
    else:
        speech_output = "I'm not sure who your contact was and what your message was. \
                        You can ask me to send a text to someone on your contact list by saying send a text to contact saying."
        reprompt_text = " I'm not sure who your contact was and what your message was. " + \
                        "You can ask me to send a text to someone on your contact list by saying send a text to contact saying. "
    return build_response(session_attributes, build_speechlet_response(
        intentTitle, speech_output, reprompt_text, should_end_session))


def create_favorite_color_attributes(favorite_color):
    return {"favoriteColor": favorite_color}


def get_contactList_from_session(intent, session):
    print("ATTEMPTING TO GET_CONTACTLIST_FROM_SESSION")
    session_attributes = {}
    reprompt_text = None                # SEE BELOW
    should_end_session = False
#Contact = intent['slots']['Contact']['value']

#if Contact in CONTACTS_LIST:
    speech_output = "Your contact list consists of "
    for contact in CONTACTS_LIST:
        speech_output += str(contact) + " "
        
    # else:
    #     speech_output = "I could not understand you. Please view your contact list by saying something like who can i text"
        

    # Setting reprompt_text to None signifies that we do not want to reprompt
    # the user. If the user does not respond or says something that is not
    # understood, the session will end.
    return build_response(session_attributes, build_speechlet_response(
        intent['name'], speech_output, reprompt_text, should_end_session))

# --------------- Helpers that build all of the responses ----------------------


def build_speechlet_response(title, output, reprompt_text, should_end_session):
    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'Simple',
            'title': 'SessionSpeechlet - ' + title,
            'content': 'SessionSpeechlet - ' + output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': reprompt_text
            }
        },
        'shouldEndSession': should_end_session
    }


def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }