import numbers
import os

import osmnx as ox
from networkx import NetworkXPointlessConcept
from django.conf import settings


class OMSnx_enregistrement:

    @staticmethod
    def tableau_vers_chaine_caractere(tableau, separateur):
        """
        Cette fonction a pour but de transformer un tableau de chaîne de caractère
        vers une chaine de caractère

        :param tableau: tableau de chaine de caractère
        :param separateur: chaîne de caractère servant à séparer les cases du tableau
        :return: concaténation des chaines de caractère du tableau sépparré à l'aide d'un ou plusieurs caractères.
        La chaine de retour commence par le séparateur
        """
        retour = ""
        for chaine in tableau:
            retour = retour + separateur + chaine
        return retour

    @staticmethod
    def sauvearde_graphique(graphique, _nom_ville, _informations_supplementaires):
        """
        Cette méthode a pour but de sauvegarder un graphique issu de OSMnx sous le format graphml dans le dossier Data


        :param _nom_ville : nom de la ville dont on veut récupérer le graphe viaire
        :param _informations_supplementaires : Les informations supplémentaires nécessaires comme le nom de la région,
        l'état, le pays ...
        :param graphique: graphique viaire à sauvegarder
        :return:
        """
        utn = ox.settings.useful_tags_node
        oxna = ox.settings.osm_xml_node_attrs
        oxnt = ox.settings.osm_xml_node_tags
        utw = ox.settings.useful_tags_way
        oxwa = ox.settings.osm_xml_way_attrs
        oxwt = ox.settings.osm_xml_way_tags
        utn = list(set(utn + oxna + oxnt))
        utw = list(set(utw + oxwa + oxwt))
        ox.settings.all_oneway = True
        ox.settings.useful_tags_node = utn
        ox.settings.useful_tags_way = utw
        ox.save_graphml(graphique, os.path.join(settings.REGISTER_DIR + "/" + _nom_ville +
                        OMSnx_enregistrement.tableau_vers_chaine_caractere(
                            _informations_supplementaires, "_") + ".graphml"
                        ))

    @staticmethod
    def recuperer_graphe_viaire_ville(_nom_ville, _informations_supplementaires):
        """
        Cette méthode permet de récupérer sur openstreetmap les données concernant le nom de la ville et les
        informations supplémentaires. Le retour peut être autre-chose qu'une ville comme une région.

        :param _nom_ville : nom de la ville dont on veut récupérer le graphe viaire
        :param _informations_supplementaires : Les informations suplémentaires nécessaire comme le nom de la région,
        l'état ou le pays
        :return: graph viaire de la ville. Les nœuds sont les intersections entre les rues et les arêtes sont les rues
        entre les intersections. En cas d'erreurs : si le nom entré ne correspond pas -1 est retourné, si la ville
        entrée ne possède pas de graph viaire -2 est retourné.
        """
        try:
            return ox.graph_from_place(_nom_ville + OMSnx_enregistrement.tableau_vers_chaine_caractere(
                _informations_supplementaires, ", "), network_type="drive")
        except ValueError:
            return -1
        except NetworkXPointlessConcept:
            return -2
