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 sauvegarde_graphique(graphique, _nom_ville, _informations_supplementaires):
        """
        Cette méthode a pour but de sauvegarder un graphique issu de OSMnx sous le format dgs de graphstream
         dans le dossier Data

         les attributs des nœuds sont :
            - y, x : ses coordonnées x et y
            - street_count : le nombre de routes à l'intersection

         les attributs des arrêtes sont :
            - osmid : identifiant openstreetmap de la route à la laquelle appartient le morceau de route
            - ref : la référence openstreetmap de la route comme D 19 : départemental 19
            - name : le nom de la route
            - highway : le type de la route
            - oneway, reversed : la possibilité de savoir si la route est dans un sens ou dans les deux
            - length : la taille du morceau de route

        :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:
        """
        pass

    @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

    @staticmethod
    def ajoute_dgs(outf, attribut, valeur):
        """
        Cette méthode permet de rajouter une valeur au fichier dgs en cours d'écriture sans retour à la ligne,
        mais une tabulation à la fin. Elle permet de distinguer les valeurs à encadrer entre deux guillemets des valeurs
        représentant des nombres. Si attribut est None, on ajoute uniquement la variable valeur

        :param outf : variable d'écriture sur le fichier
        :param attribut : clef associée à la valeur à ajouter
        :param valeur : valeur à ajouter aux dgs, c'est la variable dont il faut connaitre le type
        """
        if attribut is not None:
            outf.write(str(attribut) + ":")
        if isinstance(valeur, bool):
            valeur = valeur.real
        if isinstance(valeur, numbers.Real):
            outf.write(str(valeur) + "\t")
        else:
            outf.write("\"" + str(valeur) + "\"\t")

