from flask_restful import Resource, Api, reqparse
from flask import request
from bson import json_util, ObjectId
import json

import echo_db.database as EchoDB
import echo_api.auth as Auth
import echo_controller.controller as Controller

class DeviceInfoAPI(Resource):

    def get(self, uuid):
        # Verify Auth
        if not Auth.Auth.verify(request):
            return {'status': 'failed', 'message': 'Not Authenticated!'}, 401

        # Get Device
        collection = EchoDB.EchoDB.database['Devices']
        device = collection.find_one({"uuid": uuid})

        # Check if Device Exists
        if device == None:
            return {'status': 'failed', 'message': 'Device not found!', 'data': {}}, 404
        
        # Format and respond
        device_json = json.loads(json_util.dumps(device))
        return {'status': 'success', 'data': device_json}, 200

class DeviceControlAPI(Resource):
    def post(self):
        if not Auth.Auth.verify(request):
            return {'status': 'failed', 'message': 'Not Authenticated!'}, 401

        parser = reqparse.RequestParser()
        parser.add_argument('uuid', required = True)
        parser.add_argument('action', required = True)
        parser.add_argument('data', required = False, default = {})

        # Parse the arguments into an object
        args = parser.parse_args()

        # Get Device
        collection = EchoDB.EchoDB.database['Devices']
        device = collection.find_one({'uuid': args['uuid']})

        # Check if Device Exists
        if device == None:
            return {'status': 'failed', 'message': 'Device not found!'}, 200
        
        if args['action'] not in device['actions']:
            return {'status': 'failed', 'message': 'Action not found!'}, 200
    
        # Send Action to Echo Controller
        return Controller.Controller.handle_action(device, args['action'], args['data'])


