# /opt/planetstack/core/dashboard/views/helloworld.py
import datetime
import os
import sys
import time
import json
from django.http import HttpResponse, HttpResponseServerError, HttpResponseForbidden
from django.views.generic import TemplateView, View
from core.models import *
from django.forms.models import model_to_dict

def ensure_serializable(d):
    d2={}
    for (k,v) in d.items():
        # datetime is not json serializable
        if isinstance(v, datetime.datetime):
            d2[k] = time.mktime(v.timetuple())
        elif v.__class__.__name__ == "Geoposition":
            pass
        else:
            d2[k] = v
    return d2

def sliver_to_dict(sliver):
    d = model_to_dict(sliver)
    d["slice_id"] = sliver.slice.id
    d["node_id"] = sliver.node.id
    return d

def slice_to_dict(slice):
    d = model_to_dict(slice)
    d["slivers"] = [sliver_to_dict(x) for x in slice.slivers]
    return d

def node_to_dict(node):
    d = model_to_dict(node)
    d["slivers"] = []


class OpenCloudData:
    def __init__(self, user):
        self.loadAll()

    def loadAll(self):
        self.allNodes = list(Node.objects.all())
        self.allSlices = list(Slice.objects.all())
        self.allSlivers = list(Sliver.objects.all())
        self.allSites = list(Site.objects.all())

        self.site_id = {}
        for site in self.allSites:
            d = model_to_dict(site)
            d["node_ids"] = []
            d["slice_ids"] = []
            self.site_id[site.id] = ensure_serializable(d)

        self.node_id = {}
        for node in self.allNodes:
            d = model_to_dict(node)
            d["sliver_ids"] = []
            self.node_id[node.id] = ensure_serializable(d)
            self.site_id[node.site_id]["node_ids"].append(node.id)

        self.slice_id = {}
        for slice in self.allSlices:
            d = model_to_dict(slice)
            d["sliver_ids"] = []
            self.slice_id[slice.id] = ensure_serializable(d)
            self.site_id[slice.site_id]["slice_ids"].append(site.id)

        self.sliver_id = {}
        for sliver in self.allSlivers:
            self.sliver_id[sliver.id] = model_to_dict(sliver)

            self.slice_id[sliver.slice_id]["sliver_ids"].append(sliver.id)
            self.node_id[sliver.node_id]["sliver_ids"].append(sliver.id)

    def get_opencloud_data(self):
        return {"slices": self.slice_id.values(),
                "slivers": self.sliver_id.values(),
                "nodes": self.node_id.values(),
                "sites": self.site_id.values()}

class ShellDataView(View):
    url = r'^shelldata/'

    def get(self, request, **kwargs):
        result = OpenCloudData(request.user).get_opencloud_data()

        return HttpResponse(json.dumps(result), mimetype='application/json')
