from flask import Flask, request, render_template
from flask_restful import Resource, Api
from sqlalchemy import create_engine
from json import dumps
#adding rate limiting support
from flask import jsonify
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
import time
import sys
import os
import time
import requests

#check if a database exists or not
db_path = "vservdb/yggindex.db"
if not os.path.exists(db_path):
    print "could not find a database"
    sys.exit(0)

db_connect = create_engine('sqlite:///' + db_path)
app = Flask(__name__)
api = Api(app)

limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["500/day", "60/hour"]
)

def get_nodelist():
    data = requests.get("https://raw.githubusercontent.com/yakamok/yggdrasil-nodelist/master/nodelist")
    nodes = [x.split() for x in data.text.split('\n') if x]
    
    index_table = {}

    for x in nodes:
        index_table[x[0]] = x[1]
    return index_table


def check_nodelist(nodetable, key):
    if nodetable:
        if nodetable.get(key):
            return nodetable.get(key)
        else:
            return key
    else:
        return key


#quickly figure out which is old or new
def age_calc(ustamp):
    if (time.time() - ustamp) <= 14400 :
        return True
    else:
        return False

#active nodes in the past 4hrs
class nodes_current(Resource):
    def get(self):
        conn = db_connect.connect()
        query = conn.execute("select * from yggindex")
        nodes = {}

        for i in query.cursor.fetchall():
            if age_calc(i[2]):
                nodes[i[0]] = [i[1],i[2]]

        nodelist = {}
        nodelist['yggnodes'] = nodes

        return nodelist


@app.route("/")
def fpage():
    conn = db_connect.connect()
    query = conn.execute("select * from yggindex")
    nodes = {}

    for i in query.cursor.fetchall():
        if age_calc(i[2]):
            nodes[i[0]] = [i[1],i[2]]

    return render_template('index.html', nodes = str(len(nodes)))


@app.route("/contrib")
def cpage():
    try:
        NODELIST = get_nodelist()
        print "list exists"
    except:
        print "failed"
        NODELIST = None

    conn = db_connect.connect()
    query = conn.execute("select * from contrib")
    nodes = []

    for i in query.cursor.fetchall():
        if age_calc(i[1]):
            nodes.append(i[0])

    dnodes = []
    for x in nodes:
        dnodes.append(check_nodelist(NODELIST, x))

    dnodes.sort(reverse=True)

    return render_template('contrib.html', contribnodes = dnodes)


#sort out the api request here for the url
api.add_resource(nodes_current, '/current')
# api.add_resource(nodes_contrib, '/contrib')

if __name__ == '__main__':
     app.run(host='::', port=3000)