//package com.fleet.common.utils.hereMap;
//
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fleet.common.config.HereMapsProperties;
//import com.fleet.common.entity.hereMap.HereMapLocation;
//import com.google.gson.Gson;
//import com.google.gson.JsonArray;
//import com.google.gson.JsonObject;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.http.client.methods.CloseableHttpResponse;
//import org.apache.http.client.methods.HttpGet;
//import org.apache.http.client.utils.URIBuilder;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.net.URI;
//import java.net.URLEncoder;
//import java.net.http.HttpClient;
//import java.net.http.HttpRequest;
//import java.net.http.HttpResponse;
//import java.nio.charset.StandardCharsets;
//import java.time.Duration;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Optional;
//
///**
// * @author ID
// * @date 2025/9/1 15:33
// */
//@Component
//@Slf4j // Lombok注解：自动注入日志对象（log）
//public class HereMapsGeocoderUtil {
//
//    @Resource
//    private HereMapsProperties hereMapsProperties;
//
//    @Resource
//    private HttpClient httpClient;
//
//    @Resource
//    private ObjectMapper objectMapper;
//
//    @Value("${http.client.connect-timeout-seconds:10}")
//    private Integer connectTimeoutSeconds;
//
//    /**
//     * 根据地点名称查询坐标
//     *
//     * @param location 地点名称（如"北京天安门"）
//     * @return 地点信息+坐标列表
//     * @throws Exception 包含网络异常、API错误等
//     */
//    public List<HereMapLocation> getCoordinates(String location) throws Exception {
//        // 1. 参数校验
//        if (location == null || location.trim().isEmpty()) {
//            log.error("地点名称不能为空");
//            throw new IllegalArgumentException("地点名称不能为空");
//        }
//
//        // 2. 构建请求URL
//        URI requestUri = buildGeocodingUri(location.trim());
//        log.info("HERE Maps 地理编码请求URL：{}", requestUri);
//
//        // 3. 构建并发送HTTP请求
//        HttpRequest request = buildHttpRequest(requestUri);
//        HttpResponse<String> response = sendHttpRequest(request);
//
//        // 4. 处理响应并返回结果
//        log.info("HERE Maps API请求成功，响应体长度：{} 字符", response.body().length());
//        return parseGeocodingResponse(response.body());
//    }
//
//    /**
//     * 根据经纬度获取地理位置信息
//     *
//     * @param latitude  纬度（-90到90之间）
//     * @param longitude 经度（-180到180之间）
//     * @return 地理位置信息Optional
//     */
//    public HereMapLocation getLocationFromCoordinates(double latitude, double longitude) {
//        try {
//            // 1. 参数校验
//            validateCoordinates(latitude, longitude);
//
//            // 2. 构建请求URL
//            URI requestUri = buildReverseGeocodingUri(latitude, longitude);
//            log.info("HERE Maps 逆地理编码请求URL：{}", requestUri);
//
//            // 3. 构建并发送HTTP请求
//            HttpRequest request = buildHttpRequest(requestUri);
//            HttpResponse<String> response = sendHttpRequest(request);
//
//            // 4. 处理响应并返回结果
//            log.info("HERE Maps API请求成功，响应体长度：{} 字符", response.body().length());
//            return parseLocationResponse(response.body(), latitude, longitude);
//        } catch (Exception e) {
//            log.error("获取地理位置信息失败", e);
//            return null;
//        }
//    }
//
//    /**
//     * 构建地理编码请求URI
//     */
//    private URI buildGeocodingUri(String location) throws Exception {
//        String encodedLocation = URLEncoder.encode(location, StandardCharsets.UTF_8.name());
//
//        return new URIBuilder(hereMapsProperties.getGeocodingApiUrl())
//                .addParameter("q", encodedLocation)
//                .addParameter("apiKey", hereMapsProperties.getApiKey())
//                .build();
//    }
//
//    /**
//     * 构建逆地理编码请求URI
//     */
//    private URI buildReverseGeocodingUri(double latitude, double longitude) throws Exception {
//        return new URIBuilder(hereMapsProperties.getReverseGeocodingApiUrl())
//                .addParameter("at", String.format("%s,%s", latitude, longitude))
//                .addParameter("apiKey", hereMapsProperties.getApiKey())
//                .build();
//    }
//
//    /**
//     * 构建HTTP请求
//     */
//    private HttpRequest buildHttpRequest(URI uri) {
//        return HttpRequest.newBuilder()
//                .uri(uri)
//                .timeout(Duration.ofSeconds(connectTimeoutSeconds))
//                .header("Accept", "application/json")
//                .GET()
//                .build();
//    }
//
//    /**
//     * 发送HTTP请求并处理响应状态
//     */
//    private HttpResponse<String> sendHttpRequest(HttpRequest request) throws Exception {
//        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
//
//        int statusCode = response.statusCode();
//        if (statusCode != 200) {
//            String errorMsg = String.format(
//                    "HERE Maps API请求失败：状态码=%d, 响应体=%s",
//                    statusCode, response.body()
//            );
//            log.error(errorMsg);
//            throw new Exception(errorMsg);
//        }
//
//        return response;
//    }
//
//    /**
//     * 解析地理编码响应
//     */
//    private List<HereMapLocation> parseGeocodingResponse(String responseBody) {
//        List<HereMapLocation> results = new ArrayList<>();
//        try {
//            JsonNode rootNode = objectMapper.readTree(responseBody);
//            JsonNode itemsNode = rootNode.get("items");
//
//            if (itemsNode == null || !itemsNode.isArray() || itemsNode.size() == 0) {
//                log.warn("地理编码无匹配结果");
//                return results;
//            }
//
//            for (JsonNode item : itemsNode) {
//                String title = item.get("title").asText();
//                String address = item.get("address").get("label").asText();
//
//                JsonNode position = item.get("position");
//                double latitude = position.get("lat").asDouble();
//                double longitude = position.get("lng").asDouble();
//
//                results.add(new HereMapLocation(title, address, latitude, longitude));
//            }
//        } catch (Exception e) {
//            log.error("解析地理编码响应失败", e);
//            throw new RuntimeException("解析地理编码结果失败", e);
//        }
//        return results;
//    }
//
//    /**
//     * 解析逆地理编码响应
//     */
//    private HereMapLocation parseLocationResponse(String responseBody, double latitude, double longitude) {
//        try {
//            JsonNode rootNode = objectMapper.readTree(responseBody);
//            JsonNode itemsNode = rootNode.get("items");
//
//            if (itemsNode != null && itemsNode.isArray() && itemsNode.size() > 0) {
//                JsonNode firstItem = itemsNode.get(0);
//                JsonNode addressNode = firstItem.get("address");
//
//                HereMapLocation location = new HereMapLocation();
//                location.setTitle(firstItem.get("title").asText());
//                location.setLatitude(latitude);
//                location.setLongitude(longitude);
//                location.setAddress(addressNode.get("label").asText());
//                location.setCity(getOptionalNodeText(addressNode, "city"));
//                location.setCountry(getOptionalNodeText(addressNode, "countryName"));
//                location.setPostalCode(getOptionalNodeText(addressNode, "postalCode"));
//
//                return location;
//            }
//
//            log.warn("逆地理编码无匹配结果");
//            return null;
//        } catch (Exception e) {
//            log.error("解析逆地理编码响应失败", e);
//            throw new RuntimeException("解析地理位置结果失败", e);
//        }
//    }
//
//    /**
//     * 校验经纬度合法性
//     */
//    private void validateCoordinates(double latitude, double longitude) {
//        if (latitude < -90 || latitude > 90) {
//            log.error("纬度值不合法: {}", latitude);
//            throw new IllegalArgumentException("纬度必须在-90到90之间");
//        }
//        if (longitude < -180 || longitude > 180) {
//            log.error("经度值不合法: {}", longitude);
//            throw new IllegalArgumentException("经度必须在-180到180之间");
//        }
//    }
//
//    /**
//     * 安全获取JSON节点文本，避免空指针
//     */
//    private String getOptionalNodeText(JsonNode parentNode, String fieldName) {
//        JsonNode node = parentNode.get(fieldName);
//        return (node != null && !node.isNull()) ? node.asText() : "";
//    }
//
//}
