import json
from tornado.web import RequestHandler
from tornado.gen import coroutine
from api.model.models import GlobalConfiguration
# from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound

class GlobalConfigurationHandler(RequestHandler):

    def data_received(self, chunk):
        pass

    # GET /options
    @coroutine
    def get(self):

        try:
            session = self.settings['db']
            config_options = session.query(GlobalConfiguration).all()

            options = []
            for option in config_options:
               json_option = {
                  'key': option.key,
                  'value': option.value
               }

            options.append(json_option)
            response = {"page": 1, "options": options}

            self.set_header("Content-Type", "application/jsonp;charset=UTF-8")
            self.set_header("Access-Control-Allow-Origin", "*")
            self.write(response)

            return

        except Exception as e:
            print(e)
            response = {'message': "Could not read configuration options."}

            self.set_status(500, 'Error')
            self.set_header("Access-Control-Allow-Origin", "*")
            self.write(response)

            return

    @coroutine
    # TODO: this shit ain't secure. Authenticate user.
    def put(self):

        session = self.settings['db']
        request = self.request.body.decode("utf-8")
        json_request = json.loads(json.loads(request))

        config = session.query(GlobalConfiguration).filter(GlobalConfiguration.key == json_request['key']).one()
        config.value = str(json_request['value'])

        session.commit()

        response = {'message': "Config updated sucessfully."}
        self.set_status(200, 'Ok')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def delete(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def trace(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def connect(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def options(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def patch(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return

    @coroutine
    def head(self):
        response = {"message": "This is not a valid method for this resource."}
        self.set_status(405, 'Error')
        self.set_header("Access-Control-Allow-Origin", "*")
        self.write(response)

        return