import sys, getopt, struct, time, termios, fcntl, sys, os, colorsys, threading, time, datetime, subprocess
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/fbtft')
from RenderManager import RenderManager
from WanemManager import WanemManager
from ScBase import ScBase
from gfx import Rect
from DataAsset import CTX
from time import sleep
from TouchManager import TouchManager
from WanemManager import WanemManager
from SceneManager import SceneManager
from argparse import ArgumentParser


def keypressed():
    try:
        c = sys.stdin.read(1)
        return True
    except IOError:
        return False


def pause(secs):
    fd = sys.stdin.fileno()

    oldterm = termios.tcgetattr(fd)
    newattr = termios.tcgetattr(fd)
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
    termios.tcsetattr(fd, termios.TCSANOW, newattr)

    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

    try:
        ctrlc = False
        paused = False
        t = secs / 0.1
        i = 0
        while i < t:
            if keypressed():
                paused = True
                break
            sleep(0.1)
            i += 1

        if paused:
            while True:
                if keypressed():
                    break
                sleep(0.1)
    except KeyboardInterrupt:
        ctrlc = True

    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
    if ctrlc:
        sys.exit(1)


def main(argv):

    desc = u'{0} [Args] [Options]\nDetailed options -h or --help'.format(
        __file__)
    parser = ArgumentParser(description=desc)
    parser.add_argument('-debug', action='store_true', dest='debug')
    parser.add_argument('-scene',
                        type=str,
                        dest='initScene',
                        required=False,
                        help='initial scene')
    parser.add_argument('-proxy',
                        type=str,
                        dest='proxy',
                        required=False,
                        help='https proxy setting')
    args = parser.parse_args()
    #print str(args.debug)
    #print str(args.initScene)

    pCTX = CTX()
    pCTX.httpsProxy = args.proxy
    pRender = RenderManager()
    #pRender.RenderBaseFrame()
    pWanem = WanemManager(pCTX, pRender)
    pSceneManager = SceneManager(pCTX,
                                 pRender,
                                 pWanem,
                                 initScene=args.initScene,
                                 debug=args.debug)
    pTouch = TouchManager(pSceneManager)

    now = time.time()

    while True:
        pSceneManager.Update()

        pCTX.current = time.time()
        waitBy = now + (1 / 60.0 * pCTX.tick)
        #pTouch.Update(pWanem, TouchDownHandler, TouchUpHandler, waitBy - pCTX.current)
        pTouch.Update(waitBy - pCTX.current)

        pCTX.current = time.time()

        if waitBy > pCTX.current:
            time.sleep(waitBy - pCTX.current)
            pCTX.current = time.time()

        if pCTX.current - now >= 1.0:
            # print "pCTX.tick : %02d / %d" % (pCTX.tick, int(pCTX.current * 1000))
            now += 1.0
            pCTX.tick = 0

        pCTX.tick += 1

    pRender.Finalize()
    pTouch.Finalize()


if __name__ == '__main__':
    main(sys.argv[1:])