import requests
import json
import urllib.parse

page = 0
url = 'https://8nvhrd7onv-dsn.algolia.net/1/indexes/*/queries?x-algolia-api-key=3222e669cf890dc73fa5f38241117ba5&x-algolia-application-id=8NVHRD7ONV'

def get(page):
    search_params = {
        'aroundLatLng': "47.3768866,8.541694",
        'aroundLatLngViaIP': 'true',
        'aroundRadius': "all",
        'attributesToRetrieve': ["_geoloc","region","area_name","chef","city","country","cuisines","currency","good_menu","identifier","michelin_award","name","other_urls"],
        'facetFilters': [["distinction.slug:3-etoiles-michelin","distinction.slug:2-etoiles-michelin","distinction.slug:1-etoile-michelin"]],
        'filters': 'status:Published',
        'hitsPerPage': 20,
        'maxValuesPerFacet': 3000,
        'page': page,
        'query': ''
    }

    raw_params = ''
    for k, v in search_params.items():
        if raw_params:
            raw_params += '&'
        raw_params += k + '=' + urllib.parse.quote(str(v))


    data = '{"requests":[{"indexName":"prod-restaurants-fr","params":"%s"}]}' % raw_params
    data = data.replace('%20', '').replace('%27', '%22')
    response = requests.post(url, 
        headers = {'Origin': 'https://guide.michelin.com', 
                'Referer': 'https://guide.michelin.com/ch/fr/selection/switzerland/restaurants/3-etoiles-michelin/2-etoiles-michelin'},
        data = data)

    return json.loads(response.text)

def main():
    page = 0
    geojson = {'type': 'FeatureCollection', 'features': []}
    while True:
        r = get(page)
        page += 1
        if not r['results'][0]['hits']:
            return
        for i in r['results'][0]['hits']:
            entry =  {
                "type": "Feature",
                "geometry": {"type": "Point", "coordinates": [i['_geoloc']['lng'], i['_geoloc']['lat']]},
                "properties": {
                    "name": i['name'],
                    'award': i['michelin_award'],
                    'cuisine': i['cuisines'][0]['label'],
                    'region': i['region']['name'],
                    'url': 'https://www.google.com/search?q=' + urllib.parse.quote(i['name'] + ' ' + i['city']['name']) + '&btnI=J%27ai+de+la+chance'
                    }
            }
            geojson['features'].append(entry)
        with open("michelin.json", "w") as outfile:
            outfile.write(json.dumps(geojson))
main()