#!/usr/bin/env python3
import json
from datetime import datetime
from prefixed import Float
import humanfriendly
from flask import Flask, render_template

app = Flask(__name__)


##
# Add some custom jinja filters
def timeago(value):
    """Format a date time to human friendly time ago"""
    if value is None:
        return ""
    if type(value) is int:
        dt = datetime.fromtimestamp(value).replace(microsecond=0)
    now = datetime.now().replace(microsecond=0)
    return humanfriendly.format_timespan(now - dt)


app.jinja_env.filters["timeago"] = timeago


def human_numbers(value):
    """Format a number in human readable format"""
    if value is None:
        return ""
    return "{:!.3h}".format(Float(value))


app.jinja_env.filters["humanize"] = human_numbers


##
# Get Pool Instance Birth Date
def birthdate():
    try:
        with open("/data/p2pool.blocks") as reader:
            first_block = reader.readline().rstrip()
        bday_ts = int(first_block.split(" ")[0])
        bday = timeago(bday_ts)
        return bday
    except Exception as e:
        return "unknown time"


##
# The App Routes
@app.route("/")
def render():
    try:
        my_bday = birthdate()
        with open("/data/stats_mod", "r") as reader:
            stats_mod = json.loads(reader.read())
        with open("/data/pool/stats", "r") as reader:
            pool_stats = json.loads(reader.read())
        with open("/data/network/stats", "r") as reader:
            network_stats = json.loads(reader.read())
        with open("/data/local/stratum", "r") as reader:
            local_stats = json.loads(reader.read())
        workers = local_stats["workers"][:30] # limit workers output list
        workers_concat = []
        for w in workers:
            w_list = w.split(",")
            w_list[1] = humanfriendly.format_timespan(int(w_list[1]))
            w_list[2] = human_numbers(int(w_list[2]))
            workers_concat.append(w_list)
        workers_concat = sorted(workers_concat, key=lambda x: int(x[3]), reverse=True)
        for w in workers_concat:
            w[3] = human_numbers(int(w[3]))
        return render_template(
            "index.html",
            my_bday=my_bday,
            stats_mod=stats_mod,
            pool_stats=pool_stats,
            network_stats=network_stats,
            local_stats=local_stats,
            workers=workers_concat,
        )
    except Exception as e:
        return render_template("oops.html", error=str(e))


##
# main()
if __name__ == "__main__":
    app.run(debug=False, host="0.0.0.0", port=80)