import suggests
import networkx as nx
import pyvis
import time
from pyvis.network import Network
import pickle
import dataset

db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/hhh?charset=utf8mb4')

#cursor=db.query('select q,cnt from gap_hhh where cnt > 100')
#cursor=db.query('select q,cnt from gap_searchome where cnt > 50')
cursor=db.query('SELECT q,cnt FROM hhh.gap_searchome where q not in (select q from hhh.gap_hhh) order by cnt desc;')


def hierarchy_pos(G, root, levels=None, width=1., height=1.):
    '''If there is a cycle that is reachable from root, then this will see infinite recursion.
       G: the graph
       root: the root node
       levels: a dictionary
               key: level number (starting from 0)
               value: number of nodes in this level
       width: horizontal space allocated for drawing
       height: vertical space allocated for drawing'''
    TOTAL = "total"
    CURRENT = "current"
    def make_levels(levels, node=root, currentLevel=0, parent=None):
        """Compute the number of nodes for each level
        """
        if not currentLevel in levels:
            levels[currentLevel] = {TOTAL : 0, CURRENT : 0}
        levels[currentLevel][TOTAL] += 1
        neighbors = G.neighbors(node)
        for neighbor in neighbors:
            if not neighbor == parent:
                levels =  make_levels(levels, neighbor, currentLevel + 1, node)
        return levels

    def make_pos(pos, node=root, currentLevel=0, parent=None, vert_loc=0):
        dx = 1/levels[currentLevel][TOTAL]
        left = dx/2
        pos[node] = ((left + dx*levels[currentLevel][CURRENT])*width, vert_loc)
        levels[currentLevel][CURRENT] += 1
        neighbors = G.neighbors(node)
        for neighbor in neighbors:
            if not neighbor == parent:
                pos = make_pos(pos, neighbor, currentLevel + 1, node, vert_loc-vert_gap)
        return pos
    if levels is None:
        levels = make_levels({})
    else:
        levels = {l:{TOTAL: levels[l], CURRENT:0} for l in levels}
    vert_gap = height / (max([l for l in levels])+1)
    return make_pos({})


G = nx.Graph()

elmt_dict={}
root=None
for c in cursor:
    q=c['q']
    elmts=q.split(' ')
    for e in elmts:
        if elmt_dict.get(e) is None:
            elmt_dict[e]=[q]
        else:
            elmt_dict[e].append(q)

print(elmt_dict)

idx=0
for k,v in elmt_dict.items():
    if len(v)>2 and len(v)<20:
        for e in v:
            G.add_edge(k,e,weight=1)
            root=k

        idx+=1
G.remove_edges_from( list(nx.selfloop_edges(G)))

G2=nx.minimum_spanning_tree(G,weight=5)

#G3=hierarchy_pos(G2,root)

pyG = Network(height="750px", width="100%",bgcolor="#333333",font_color="white")

#pyG.set_options()
pyG.from_nx(G2)
#pyG.enable_physics(False)
#pyG.barnes_hut()
pyG.show('gs.html')
print(idx)