from flask_restful import Resource, request, abort
from marshmallow import Schema, fields
import pika
import json


class ReceiveQuerySchema(Schema):
    client_id = fields.Str(required=True)
    secret = fields.Str(required=True)
    max_messages = fields.Int(required=False)


class Receive(Resource):
    clients = None
    schema = None

    def __init__(self):
        self.schema = ReceiveQuerySchema()
        with open("clients.json", "r") as clients_file:
            self.clients = json.load(clients_file)

    def get(self):
        errors = self.schema.validate(request.args)
        if errors:
            abort(400, str(errors))

        messages = []
        allow = False
        max_messages = request.args.get("max_messages", 10)
        client_id = request.args.get("client_id")
        inbox_queue = client_id + "-inbox"
        if client_id in self.clients:
            client = self.clients.get(client_id)
            if request.args.get("secret") == client.get("secret"):
                allow = True

        if allow:
            connection = pika.BlockingConnection(
                pika.ConnectionParameters(host="localhost")
            )
            channel = connection.channel()
            channel.queue_declare(queue=inbox_queue, durable=True)
            while len(messages) < max_messages:
                method_frame, header_frame, body = channel.basic_get(inbox_queue)
                if method_frame:
                    print(method_frame, header_frame, body)
                    channel.basic_ack(method_frame.delivery_tag)
                    messages.append(json.loads(body.decode()))
                else:
                    print("No message returned")
                    break
            channel.close()
            connection.close()

        else:
            abort(403, message="Invalid client credentials")
        return messages