from flask_restful import Resource
from flask import request
from flask_jwt_extended import jwt_required
from marshmallow import ValidationError
from master.schema.instanceschema import InstanceSchema
from master import ctx
import json
from netaddr import IPAddress

class Instance(Resource):
    def get(self, id=None):
        if id is None:
            schema = InstanceSchema(many=True)
            instances = schema.dump(ctx.get_instances())
            return instances
        else:
            try:
                instance = ctx.get_instance(id)
                return InstanceSchema().dump(instance)
            except KeyError:
                return {'message' : 'instance not found'}, 404

    @jwt_required
    def put(self, id):
        try:
            for server in request.json['servers']:
                if 'ip' not in server or IPAddress(server['ip']).is_private() or IPAddress(server['ip']).is_loopback():
                    server['ip'] = request.remote_addr
                if 'version' not in server:
                    server['version'] = 'Unknown'
            instance = InstanceSchema().load(request.json)
        except ValidationError as err:
            return {'message' : err.messages }, 400
        ctx.update_instance(instance)
        return { 'message' : 'instance updated successfully' }, 200

    @jwt_required
    def post(self):
        try:
            for server in request.json['servers']:
               if 'ip' not in server or server['ip'] == 'localhost':
                    server['ip'] = request.remote_addr
               if 'version' not in server:
                    server['version'] = 'Unknown'
            instance = InstanceSchema().load(request.json)
        except ValidationError as err:
            return {'message' : err.messages }, 400
        ctx.add_instance(instance)
        return { 'message' : 'instance added successfully' }, 200