from __future__ import print_function
from fatsecret import Fatsecret

# --------------- 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
    }


# --------------- 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 Macros Skill."
    # 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 = "Please communicate with me by asking, " \
                    "what are the macros for broccoli"
    should_end_session = False
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))


def handle_session_end_request():
    card_title = "Session Ended"
    speech_output = "Thank you for trying the Alexa macros skill. " \
                    "Have a nice day! "
    # Setting this to true ends the session and exits the skill.
    should_end_session = True
    return build_response({}, build_speechlet_response(
        card_title, speech_output, None, should_end_session))


def create_food_attributes(food, amount=None, measurement=None):
    consumer_key = '2430c39a9a3545fe95340690808444f7'
    consumer_secret = '9d60923bee3c4a209b053bcacd8f7159'
    fs = Fatsecret(consumer_key, consumer_secret)

    searchResults = fs.foods_search(str(food), max_results=10)

    finalFood = None

    for result in searchResults:
        servingTypes = fs.food_get(result['food_id'])['servings']['serving']

        if(not measurement or not amount):
            finalFood = servingTypes[0]
            break
        #endif

        for serving in servingTypes:
            if(not isinstance(serving, str) and measurement in serving['measurement_description'] and int(float(serving['number_of_units'])) == 1):
                finalFood = serving
                break
            #endif

            if(finalFood == None):
                finalFood = servingTypes[0]
            #endif
        # endfor
    # endfor

    fs.close()

    calories = int(int(finalFood['calories']) * (1 if amount == None else (amount/servingSize)))
    fat = int(round(float(finalFood['fat']) * (1 if amount == None else (amount/servingSize))))
    carbs = int(round(float(finalFood['carbohydrate']) * (1 if amount == None else (amount/servingSize))))
    protein = int(round(float(finalFood['protein']) * (1 if amount == None else (amount/servingSize))))

    return {"carbs": carbs, "protein": protein, "fat": fat, "calories": calories}


def set_food_in_session(intent, session):
    card_title = intent['name']
    session_attributes = {}
    should_end_session = False
    speech_output = "I'm not sure what food you said. " \
                        "Please try again."
    reprompt_text = "Please communicate with me by asking, " \
                        "what are the macros for broccoli"

    try:
        if 'Food' in intent['slots']:
            food = intent['slots']['Food']['value']
            amount = intent['slots']['Amount']['value'] if 'Amount' in intent['slots'] else None
            measurement = intent['slots']['Measurement']['value'] if 'Measurement' in intent['slots'] else None
            session_attributes = create_food_attributes(food, amount, measurement)
            speech_output = "The nutrition facts for " + str(food) + " are " \
                            + "Calories: " + str(session_attributes["calories"]) + ", " \
                            + "Fat: " + str(session_attributes["fat"]) + " grams, " \
                            + "Carbs: " + str(session_attributes["carbs"]) + " grams, and " \
                            + "Protein: " + str(session_attributes["protein"]) + " grams."
    except KeyError:
        print("Found keyerror")

    # TODO comment out the print statement
    # print(speech_output)

    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))


#def get_color_from_session(intent, session):
#    session_attributes = {}
#    reprompt_text = None

#    if session.get('attributes', {}) and "favoriteColor" in session.get('attributes', {}):
#        favorite_color = session['attributes']['favoriteColor']
#        speech_output = "Your favorite color is " + favorite_color + \
#                        ". Goodbye."
#        should_end_session = True
#    else:
#        speech_output = "I'm not sure what your favorite color is. " \
#                        "You can say, my favorite color is red."
#        should_end_session = False

    # 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))


# --------------- Events ------------------

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 == "MyFoodIntent":
        return set_food_in_session(intent, session)
    # elif intent_name == "WhatsMyColorIntent":
    #    return get_color_from_session(intent, session)
    elif intent_name == "AMAZON.HelpIntent":
        return get_welcome_response()
    elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
        return handle_session_end_request()
    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


# --------------- Main handler ------------------

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'])

    # 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'])


if __name__ == '__main__':
   on_intent({'intent':{'name':"MyFoodIntent", 'slots':{'Food':{'value':'chicken tofu'}}},'requestId':'69'}, {'sessionId':'69'})
