from request import requete_osm
from math import sqrt, sin, cos, pi
import time

def circular_research(lat, lon, main_street):
    #Recherche un rue autre que main_street par recherche circulaire autour du point d'intersection
    try:
        street = requete_osm(lat, lon)['address']['road']
    except KeyError:
        street = ''
    #si on trouve une rue qui convient
    if not(street == main_street) and not(street == ''):
        return street
    #sinon, on cherche autour de ce point
    step = 5*10**(-5)
    #on limite la taille du "cercle" de recherche pour ne pas tomber sur des rues trop éloignées
    while step < 6*10**(-5):
        for i in range(8):
            street = check_position(lat, lon, step, main_street, i)
            if not(street == main_street) and not(street == ''):
                return street
        step += 4*10**(-5)
    #si on n'a toujours rien trouvé, c'est que le point d'intersection ne correspond pas
    #  à une intersection avec une rue différente de main street
    return None

def circular_research_2(lat, lon, main_street=''):
    #Recherche une rue autre que vide par recherche circulaire autour du point d'intersection
    #cette fonction est appelée lorsqu'on ne trouve pas de rue associée à un arbe
    #la seule différence avec la fonction précédente est donc qu'ici on impose de renvoyer une rue
    #quitte à s'éloigner énormément de l'arbre, il n'y a donc pas ici de limite pour la taille du "cercle"
    #on peut donc traiter le cas où l'arbre est au milieu d'un parc par exemple
    step = 2*10**(-5)
    found = False
    while not(found):
        for i in range(8):
            street = check_position(lat, lon, step, main_street, i)
            if not(street == main_street):
                return street
        step += 2*10**(-5)
    return street

def check_position(lat, lon, step, main_street, i):
    #i compris entre 0 et 7
    #Calcul les positions autour du point central et récupère la rue associée à cette position
    #cette fonction peut être appelée jusqu'à 8 fois
    street = ''
    step_diag = step/sqrt(2)
    if i == 0:
        try:
            street = requete_osm(lat+step, lon)['address']['road']
        except KeyError:
            pass
    elif i == 1:
        try:
            street = requete_osm(lat+step_diag, lon+step_diag)['address']['road']
        except KeyError:
            pass
    elif i == 2:
        try:
            street = requete_osm(lat, lon+step)['address']['road']
        except KeyError:
            pass
    elif i == 3:
        try:
            street = requete_osm(lat-step_diag, lon+step_diag)['address']['road']
        except KeyError:
            pass
    elif i == 4:
        try:
            street = requete_osm(lat-step, lon)['address']['road']
        except KeyError:
            pass
    elif i == 5:
        try:
            street = requete_osm(lat-step_diag, lon-step_diag)['address']['road']
        except KeyError:
            pass
    elif i == 6:
        try:
            street = requete_osm(lat, lon-step)['address']['road']
        except KeyError:
            pass
    elif i == 7:
        try:
            street = requete_osm(lat+step_diag, lon-step_diag)['address']['road']
        except KeyError:
            pass
    return street


if __name__=="__main__": 
    lat = 48.89494122
    lon = 2.247959188
    step = 10**(-5)
    main_street = 'Avenue Gambetta'
    #print(len(list(streets)))
    print(t2-t1)
    t1 = time.time()
    for j in range(1,4):
        stp = j*step
        for i in range(8):
            check_position(lat, lon, stp, main_street, i)
    t2 = time.time()
    print(t2-t1)