import json
import re

from flask import Blueprint, jsonify, Response, current_app

from inventory_provider.routes import common
from inventory_provider.db import db
from inventory_provider.db import opsdb

routes = Blueprint("inventory-data-query-routes", __name__)


@routes.route("/routers", methods=['GET', 'POST'])
@common.require_accepts_json
def routers():
    r = common.get_redis()
    result = []
    for k in r.keys('netconf:*'):
        m = re.match('^netconf:(.+)$', k.decode('utf-8'))
        assert m
        result.append(m.group(1))
    return jsonify(result)


@routes.route("/interfaces/<hostname>", methods=['GET', 'POST'])
@common.require_accepts_json
def router_interfaces(hostname):
    r = common.get_redis()
    interfaces = []
    for k in r.keys('netconf-interfaces:%s:*' % hostname):
        ifc = r.get(k.decode('utf-8'))
        if ifc:
            interfaces.append(json.loads(ifc.decode('utf-8')))

    if not interfaces:
        return Response(
            response="no available interface info for '%s'" % hostname,
            status=404,
            mimetype="text/html")

    return jsonify(interfaces)


@routes.route("/pop/<equipment_name>", methods=['GET', 'POST'])
@common.require_accepts_json
def equipment_location(equipment_name):
    config = current_app.config['INVENTORY_PROVIDER_CONFIG']

    with db.connection(config['ops-db']) as cx:
        result = opsdb.lookup_pop_info(cx, equipment_name)

    if not result:
        return Response(
            response="no available info for {}".format(equipment_name),
            status=404,
            mimetype="text/html")

    return jsonify(result)