# Copyright (c) Meta Platforms, Inc. and affiliates.

import json
from pathlib import Path
from typing import Dict, Optional

import urllib3


from utils.geo import BoundaryBox
import urllib.request
import requests

def get_osm(
    boundary_box: BoundaryBox,
    cache_path: Optional[Path] = None,
    overwrite: bool = False,
) -> str:
    if not overwrite and cache_path is not None and cache_path.is_file():
        with cache_path.open() as fp:
            return json.load(fp)

    (bottom, left), (top, right) = boundary_box.min_, boundary_box.max_
    content: bytes = get_web_data(
        "https://api.openstreetmap.org/api/0.6/map.json",
        # "https://openstreetmap.erniubot.live/api/0.6/map.json",
        # 'https://overpass-api.de/api/map',
        # 'http://localhost:29505/api/map',
        # "https://lz4.overpass-api.de/api/interpreter",
        {"bbox": f"{left},{bottom},{right},{top}"},
    )

    content_str = content.decode("utf-8")
    if content_str.startswith("You requested too many nodes"):
        raise ValueError(content_str)

    if cache_path is not None:
        with cache_path.open("bw+") as fp:
            fp.write(content)
    a=json.loads(content_str)
    return json.loads(content_str)


def get_web_data(address: str, parameters: Dict[str, str]) -> bytes:
    # logger.info("Getting %s...", address)
    # proxy_address = "http://107.173.122.186:3128"
    #
    # # 设置代理服务器地址和端口
    # proxies = {
    #     'http': proxy_address,
    #     'https': proxy_address
    # }

    # 发送GET请求并返回响应数据
    # response = requests.get(address, params=parameters, timeout=100, proxies=proxies)
    print('url:',address)
    response = requests.get(address, params=parameters, timeout=100)
    return response.content
def get_web_data(address: str, parameters: Dict[str, str]) -> bytes:
    # logger.info("Getting %s...", address)
    while True:
        try:
            # proxy_address = "http://107.173.122.186:3128"
            #
            # # 设置代理服务器地址和端口
            # proxies = {
            #     'http': proxy_address,
            #     'https': proxy_address
            # }
            # # 发送GET请求并返回响应数据
            response = requests.get(address, params=parameters, timeout=100)
            request = requests.Request('GET', address, params=parameters)
            prepared_request = request.prepare()
            # 获取完整URL
            full_url = prepared_request.url
            break

        except Exception as e:
            # 打印错误信息
            print(f"发生错误: {e}")
            print("重试...")

    return response.content
# def get_web_data_2(address: str, parameters: Dict[str, str]) -> bytes:
#     # logger.info("Getting %s...", address)
#     proxy_address="http://107.173.122.186:3128"
#     http = urllib3.PoolManager(proxy_url=proxy_address)
#     result = http.request("GET", address, parameters, timeout=100)
#     return result.data
#
#
# def get_web_data_1(address: str, parameters: Dict[str, str]) -> bytes:
#
#     # 设置代理服务器地址和端口
#     proxy_address = "http://107.173.122.186:3128"
#
#     # 创建ProxyHandler对象
#     proxy_handler = urllib.request.ProxyHandler({'http': proxy_address})
#
#     # 构建查询字符串
#     query_string = urllib.parse.urlencode(parameters)
#
#     # 构建完整的URL
#     url = address + '?' + query_string
#     print(url)
#     # 创建OpenerDirector对象,并将ProxyHandler对象作为参数传递
#     opener = urllib.request.build_opener(proxy_handler)
#
#     # 使用OpenerDirector对象发送请求
#     response = opener.open(url)
#
#     # 发送GET请求
#     # response = urllib.request.urlopen(url, timeout=100)
#
#     # 读取响应内容
#     data = response.read()
#     print()
#     return data