import StringIO
import json
import logging
import random
import urllib
import urllib2

# for sending images
from PIL import Image
import multipart

# standard app engine imports
from google.appengine.api import urlfetch
from google.appengine.ext import ndb
import webapp2

import string

TOKEN = '<KEY>'

BASE_URL = 'https://api.telegram.org/bot' + TOKEN + '/'

API_URL = 'http://crocodic.net/teddy/public/api/'

# ================================

class EnableStatus(ndb.Model):
    # key name: str(chat_id)
    enabled = ndb.BooleanProperty(indexed=False, default=False)

# ================================

def setEnabled(chat_id, yes):
    es = EnableStatus.get_or_insert(str(chat_id))
    es.enabled = yes
    es.put()

def getEnabled(chat_id):
    es = EnableStatus.get_by_id(str(chat_id))
    if es:
        return es.enabled
    return False
# ================================

class MeHandler(webapp2.RequestHandler):
    def get(self):
        urlfetch.set_default_fetch_deadline(60)
        self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getMe'))))


class GetUpdatesHandler(webapp2.RequestHandler):
    def get(self):
        urlfetch.set_default_fetch_deadline(60)
        self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getUpdates'))))


class SetWebhookHandler(webapp2.RequestHandler):
    def get(self):
        urlfetch.set_default_fetch_deadline(60)
        url = self.request.get('url')
        if url:
            self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'setWebhook', urllib.urlencode({'url': url})))))


class WebhookHandler(webapp2.RequestHandler):
    def post(self):
        urlfetch.set_default_fetch_deadline(60)
        body = json.loads(self.request.body)
        logging.info('request body:')
        logging.info(body)
        self.response.write(json.dumps(body))

    update_id = body['update_id']
    message = body['message']
    message_id = message.get('message_id')
    date = message.get('date')
    text = message.get('text')
    fr = message.get('from')
    chat = message['chat']
    chat_id = chat['id']
    
    nd = fr.get('first_name')
    nb = fr.get('last_name')
    
    lap = 'Report\t:'
	pl = 'Plan\t\t:'
	namalengkap = "%s %s" % (nd,nb)
	lapor  = "%s\nFrom\t\t\t\t: %s" % (text,namalengkap)
	laporan = lapor[8:len(lapor)]
	
	laporanfix = "%s %s" % (lap,lapor)
	laporanlead = "%s just reported something." % (namalengkap)

	planfix = "%s %s" % (pl,lapor)
	planlead = "%s just created something plan today." % (namalengkap)
	
	pemulai = "Start\nid: %s\nnama: %s %s" % (chat_id,nd,nb)

	namapemulai = "%s %s" % (nd,nb)

    if not text:
        logging.info('no text')
        return

	def apiregister(telegramid=None, name=None):
	    resp = urllib2.urlopen(API_URL + 'register', urllib.urlencode({
		            'telegramid': telegramid,
		            'name': name,
		        })).read()
		        
	    logging.info('send response:')
	    logging.info(resp)

    def talk(msg=None):
		resp = urllib2.urlopen(API_URL + 'talk', urllib.urlencode({
		            'talk': msg,
		        })).read()
		reply(resp)
	    logging.info('send response:')
	    logging.info(resp)

    def reply(msg=None, img=None):
        if msg:
            resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({
                'chat_id': str(chat_id),
                'text': msg.encode('utf-8'),
                'disable_web_page_preview': 'false',
            })).read()
        elif img:
            resp = multipart.post_multipart(BASE_URL + 'sendPhoto', [
                ('chat_id', str(chat_id)),
                ('reply_to_message_id', str(message_id)),
            ], [
                ('photo', 'image.jpg', img),
            ])
        else:
            logging.error('no msg or img specified')
            resp = None

        logging.info('send response:')
        logging.info(resp)

    if text.startswith('/'):
        if text == '/start':
            reply('Hallo, how are you dude?')
            setEnabled(chat_id, True)
			apiregister(chat_id, namapemulai)
            resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({
	            'chat_id': '94098944',
	            'text': pemulai.encode('utf-8'),
	            'disable_web_page_preview': 'true',
	        })).read()
	        
			logging.info('send response:')
			logging.info(resp)
		    elif text == '/roll':
			playroll = random.randint(0,99)
			stringplayroll = "%d - %s %s" % (playroll,nd,nb)
			reply('%d' % (playroll))
			resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({
			            'chat_id': '94098944',
			            'text': stringplayroll.encode('utf-8'),
			            'disable_web_page_preview': 'true',
			        })).read()
			        
			logging.info('send response:')
			logging.info(resp)
        elif text == '/stop':
            reply('See you later...')
            setEnabled(chat_id, False)
        else:
            reply('What command?')

        # CUSTOMIZE FROM HERE

        elif 'who are you' in text:
            reply('My name is Teddy.\nYz is own me.')
        elif 'what time' in text:
            reply('look at the corner of your screen!')
        else:
            if getEnabled(chat_id):
            	talk(text)
            else:
                logging.info('not enabled for chat_id {}'.format(chat_id))


app = webapp2.WSGIApplication([
    ('/me', MeHandler),
    ('/updates', GetUpdatesHandler),
    ('/set_webhook', SetWebhookHandler),
    ('/webhook', WebhookHandler),
], debug=True)
