from request import requete_osm
from math import sqrt, sin, cos, pi
from concurrent.futures import ThreadPoolExecutor
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 = ''
    if not(street == main_street) and not(street == ''):
        return street
    step = 5*10**(-5)
    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)
    return None

def check_position(lat, lon, step, main_street, i):
    #Calcul les positions autour du point centrale et récupère la rue associée à cette position
    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


def multi_position(lat, lon, step):
    latitude = []
    longitude = []
    for j in range(1,4):
        stp = j*step
        for i in range(8):
            latitude.append(lat+stp*cos(i*2*pi/8))
            longitude.append(lon+stp*sin(i*2*pi/8))
    with ThreadPoolExecutor(max_workers=30) as executor:
        streets = executor.map(requete_osm, latitude, longitude)
        executor.shutdown(wait=True)
    return streets

if __name__=="__main__": 
    lat = 48.89494122
    lon = 2.247959188
    step = 10**(-5)
    main_street = 'Avenue Gambetta'
    t1 = time.time()
    streets = multi_position(48.89494122, 2.247959188, 10**(-5))
    t2 = time.time()
    #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)