import sqlite3
import time

import connection
import server_controller
import model
from bottle import run, response, route, redirect

from server_controller import not_found
from debug import debug

if __name__ == '__main__':
    print('sqlite3.version', model.db.version)

    valid_routes = ['login',
                    'register',
                    'depot',
                    'activate_key',
                    'order', 'orders',
                    'news',
                    'transactions',
                    'orders_on',
                    'cancel_order',
                    'leaderboard',
                    'tradables',
                    'gift',
                    'change_password']


    @route('/<path>', method='POST')
    def process(path):
        start = time.clock()
        path = path.strip().lower()
        if path not in valid_routes:
            print('Processing time:', time.clock() - start)
            return not_found()
        response.content_type = 'application/json'
        method_to_call = getattr(server_controller, path)
        try:
            model.drop_expired_orders()
            resp = method_to_call()
            if response.status_code == 200:
                model.connection.commit()
            else:
                model.connection.rollback()
            print('Processing time:', time.clock() - start)
            return resp
        except sqlite3.IntegrityError as e:
            print(e)
            model.connection.rollback()
            print('Processing time:', time.clock() - start)
            return server_controller.bad_request('Action violates database constraints.')


    @route('/', method='GET')
    def process():
        redirect('http://koljastrohm-games.com/downloads/orderer_installer.zip')


    run(host='0.0.0.0', port=connection.port, debug=debug)
    model.connection.close()