import os
import sys
import requests
import json
from urlparse import urlsplit,urlunsplit
from flask import Flask
from flask import request
from flask import Response

app = Flask(__name__)

USERNAME = 'giphy' # username the bot posts as
ICON_URL = 'https://api.giphy.com/img/api_giphy_logo.png' # display picture the bot posts with
RATING = 'pg' # the maximum parental rating of gifs posted (y, pg, pg-13, r)
SCHEME = 'https' # scheme to be used for the gif url returned to mattermost

GIPHY_API_KEY = 'dc6zaTOxFJmzC' # this is a public beta key, for production use you must go to http://api.giphy.com/submit and request a production key
MATTERMOST_GIPHY_TOKEN = '' # the Mattermost token generated when you created your outgoing webhook

@app.route('/')
def root():
    """
    Home handler
    """

    return "OK"

@app.route('/new_post', methods=['POST'])
def new_post():
    """
    Mattermost new post event handler
    """

    data = request.form

    if MATTERMOST_GIPHY_TOKEN.find(data['token']) == -1:
        print('Tokens did not match, it is possible that this request came from somewhere other than Mattermost')
        return 'OK'

    translate_text = data['text'][len(data['trigger_word']):]

    if len(translate_text) == 0:
        print("No translate text provided, not hitting Giphy")
        return 'OK'

    gif_url = giphy_translate(translate_text)

    if len(gif_url) == 0:
        print('No gif url found, not returning a post to Mattermost')
        return 'OK'

    resp_data = {}
    resp_data['text'] = gif_url
    resp_data['username'] = USERNAME
    resp_data['icon_url'] = ICON_URL

    resp = Response(content_type='application/json')
    resp.set_data(json.dumps(resp_data))

    return resp

def giphy_translate(text):
    """
    Giphy translate method, uses the Giphy API to find an appropriate gif url
    """

    params = {}
    params['s'] = text
    params['rating'] = RATING
    params['api_key'] = GIPHY_API_KEY

    resp = requests.get('https://api.giphy.com/v1/gifs/translate', params=params, verify=True)

    if resp.status_code is not requests.codes.ok:
        print('Encountered error using Giphy API, text=%s, status=%d, response_body=%s' % (text, resp.status_code, resp.json()))
        return ''

    resp_data = resp.json()

    url = list(urlsplit(resp_data['data']['images']['original']['url']))
    url[0] = SCHEME.lower()
    return urlunsplit(url)


if __name__ == "__main__":
    USERNAME = os.environ.get('USERNAME', USERNAME)
    ICON_URL = os.environ.get('ICON_URL', ICON_URL)
    RATING = os.environ.get('RATING', RATING)
    SCHEME = os.environ.get('SCHEME', SCHEME)
    GIPHY_API_KEY = os.environ.get('GIPHY_API_KEY', GIPHY_API_KEY)
    MATTERMOST_GIPHY_TOKEN = os.environ.get('MATTERMOST_GIPHY_TOKEN', MATTERMOST_GIPHY_TOKEN)

    if len(GIPHY_API_KEY) == 0:
        print("GIPHY_API_KEY must be configured. Please see README.md for instructions")
        sys.exit()

    if len(MATTERMOST_GIPHY_TOKEN) == 0:
        print("MATTERMOST_GIPHY_TOKEN must be configured. Please see README.md for instructions")
        sys.exit()

    port = int(os.environ.get('MATTERMOST_GIPHY_PORT', 5000))
    # use 0.0.0.0 if it shall be accessible from outside of host
    app.run(host='127.0.0.1', port=port)