# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

import json
import uuid
from flask import Flask,request,make_response
from beaker.middleware import SessionMiddleware
app = Flask(__name__)

tenant_networks = []
tenant_ports = []

@app.route("/ws.v1/login", methods=["POST",])
def login():
	assert "username" in request.form
	assert "password" in request.form
        request.environ["beaker.session"]["login"] = True
	res = make_response("", 200)
	res.headers["Content-type"] = "application/json"
	return res

@app.route("/ssp.v1/tenant-networks", methods=["POST",])
def create_tenant_network():
        if "login" not in request.environ["beaker.session"]:
                return make_response("", 401)
	obj = request.json
	obj["uuid"] = str(uuid.uuid1())
	tenant_networks.append(obj)
	res = make_response(json.dumps(obj), 201)
	res.headers["Content-type"] = "application/json"
	return res

@app.route("/ssp.v1/tenant-networks/<tenant_net_uuid>", methods=["DELETE",])
def delete_tenant_network(tenant_net_uuid):
        if "login" not in request.environ["beaker.session"]:
                return make_response("", 401)
	for net in tenant_networks:
		if net["uuid"] == tenant_net_uuid:
			tenant_networks.remove(net)
			return make_response("", 204)
	return make_response("", 404)

@app.route("/ssp.v1/tenant-ports", methods=["POST",])
def create_tenant_port():
        if "login" not in request.environ["beaker.session"]:
                return make_response("", 401)
	obj = request.json
	obj["uuid"] = str(uuid.uuid1())
	tenant_ports.append(obj)
	res = make_response(json.dumps(obj), 201)
	res.headers["Content-type"] = "application/json"
	return res

@app.route("/ssp.v1/tenant-ports/<tenant_port_uuid>", methods=["DELETE",])
def delete_tenant_port(tenant_port_uuid):
        if "login" not in request.environ["beaker.session"]:
                return make_response("", 401)
	for port in tenant_ports:
		if port["uuid"] == tenant_port_uuid:
			tenant_ports.remove(port)
			return make_response("", 204)
	return make_response("", 404)

@app.route("/ssp.v1/tenant-ports/<tenant_port_uuid>", methods=["PUT",])
def update_tenant_port(tenant_port_uuid):
        if "login" not in request.environ["beaker.session"]:
                return make_response("", 401)
	for port in tenant_ports:
		if port["uuid"] == tenant_port_uuid:
			obj = request.json
			obj["uuid"] = tenant_port_uuid
			obj["vlan_id"] = 100
			tenant_ports.remove(port)
			tenant_ports.append(obj)
			res = make_response(json.dumps(obj), 200)
			res.headers["Content-type"] = "application/json"
			return res
	return make_response("", 404)

if __name__=="__main__":
    app.wsgi_app = SessionMiddleware(app.wsgi_app, {
       "session.auto":True,
       "session.type":"cookie",
       "session.validate_key":"hoge"})
    app.run(host="0.0.0.0", port=9080, debug=True)
