"""
Versió 0.99

"""

import networkx as nx

def relacions(lv, la):
    """
    Retorna un grap amb els nodes lv i les arestes la
    """
    G = nx.Graph()
    G.add_nodes_from(lv)
    G.add_edges_from(la)
    return G

def amistats_directes(G, n):
    """
    Retorna la llista d'amistats directes de n
    """
    l = G.neighbors(n)
    return sorted(l)

def son_amistat_1(G, nom1, nom2):
    """
    Indica si nom1 i nom2 són amistat i quantes persones hi ha entre mig
    """
    try:
        amics = True
        dist = nx.shortest_path_length(G, nom1, nom2)-1
    except nx.NetworkXNoPath:
        amics = False
        dist = None
    return amics, dist

def son_amistat_2(G, nom1, nom2):
    """
    Indica si nom1 i nom2 són amistat i quantes persones hi ha entre mig
    """
    if nx.has_path(G, nom1, nom2):
        amics = True
        dist = nx.shortest_path_length(G, nom1, nom2)-1
    else:
        amics = False
        dist = None
    return amics, dist

# Tria la versió de som_amistat que vulguis provar
son_amistat = son_amistat_1
# son_amistat = son_amistat_2

def nombre_grups(G) :
    """
    Retorna el nombre de grups aillats del graf
    """
    nc = nx.number_connected_components(G)
    return nc

def solitaries_1(G):
    l =nx.isolates(G)
    return sorted(l)

def solitaries_2(G):
    # Els nodes solitaris tenen grau 0
    grau0 = filter(lambda n: G.degree[n] == 0, G.nodes)
    grau0_ord = sorted(grau0)
    return grau0_ord

def solitaries_3(G):
    """
    Retorna la llista ordenada alfabeticament de les persones que no tenen cap amic, snif!
    """
    # Els nodes solitaris són l'únic node del seu component connex
    c = nx.connected_component_subgraphs(G)
    l = []
    for e in c :
        if e.order() == 1:
            l.extend(e.nodes)
    l.sort()
    return l

# Tria la versio de solitaries que vulguis provar
solitaries = solitaries_1
# solitaries = solitaries_2
# solitaries = solitaries_3


def amistats_totals_1(G, persona):
    """
    Retorna la llista ordenada alfabeticament de tots els amics i amigues de la persona
    """
    # Els amics són tots els nodel del component de la persona
    cjt = nx.node_connected_component(G, persona) - {persona}
    return sorted(cjt)

def amistats_totals_2(G, persona):
    """
    Retorna la llista ordenada alfabeticament de tots els amics i amigues de la persona
    """
    l = sorted(nx.dfs_preorder_nodes(G, persona))
    l.remove(persona)
    return l

# Tria la versio de amistats_totals que vulguis provar
amistats_totals = amistats_totals_1
# amistats_totals = amistats_totals_2
