package com.ghy.common.utils;

import com.alibaba.fastjson.JSONObject;
import com.ghy.common.utils.http.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 百度地图API工具类
 * 专门用于地址转经纬度等地理编码功能
 * 
 * @author system
 */
@Component
public class BaiduMapUtils {
    
    private static final Logger logger = LoggerFactory.getLogger(BaiduMapUtils.class);
    
    @Value("${baidu.ak}")
    private String baiduAk;
    
    /**
     * 通过详细地址获取经纬度坐标
     * 
     * @param provinceName 省份名称
     * @param cityName 城市名称
     * @param countryName 区县名称
     * @param streetName 街道名称
     * @param detailAddress 详细地址
     * @return 包含经纬度的Map，失败返回null
     */
    public Map<String, Double> getCoordinatesByAddress(String provinceName, String cityName, 
                                                      String countryName, String streetName, 
                                                      String detailAddress) {
        try {
            // 构建完整地址
            StringBuilder fullAddress = new StringBuilder();
            if (provinceName != null && !provinceName.trim().isEmpty()) {
                fullAddress.append(provinceName);
            }
            if (cityName != null && !cityName.trim().isEmpty()) {
                fullAddress.append(cityName);
            }
            if (countryName != null && !countryName.trim().isEmpty()) {
                fullAddress.append(countryName);
            }
            if (streetName != null && !streetName.trim().isEmpty()) {
                fullAddress.append(streetName);
            }
            if (detailAddress != null && !detailAddress.trim().isEmpty()) {
                fullAddress.append(detailAddress);
            }
            
            String address = fullAddress.toString();
            if (address.trim().isEmpty()) {
                logger.warn("地址信息为空，无法获取坐标");
                return null;
            }
            
            logger.info("开始调用百度地图API解析地址: {}", address);
            
            // 调用百度地图正向地理编码API
            String encoded = URLEncoder.encode(address, StandardCharsets.UTF_8.name());
            String url = "https://api.map.baidu.com/geocoding/v3/?output=json&ak=" + baiduAk + "&address=" + encoded;
            
            // 使用HttpUtils发送GET请求
            String result = HttpUtils.sendGet(url);
            if (result == null || result.trim().isEmpty()) {
                logger.error("百度地图API返回结果为空");
                return null;
            }
            
            result = result.replaceAll("\n", "").replaceAll("\t", "");
            
            // 解析返回结果
            JSONObject resultJson = JSONObject.parseObject(result);
            if ("0".equals(resultJson.getString("status"))) {
                JSONObject location = resultJson.getJSONObject("result").getJSONObject("location");
                Double lng = location.getDouble("lng");
                Double lat = location.getDouble("lat");
                
                Map<String, Double> coordinates = new HashMap<>();
                coordinates.put("longitude", lng);
                coordinates.put("latitude", lat);
                
                logger.info("百度地图API解析成功: {} -> 经度={}, 纬度={}", address, lng, lat);
                return coordinates;
            } else {
                logger.error("百度地图API解析失败: {} - {}", address, resultJson.getString("msg"));
                return null;
            }
            
        } catch (Exception e) {
            logger.error("调用百度地图API失败: {} - {}", 
                        String.format("省:%s,市:%s,区:%s,街道:%s,详细:%s", 
                                    provinceName, cityName, countryName, streetName, detailAddress), 
                        e.getMessage(), e);
            return null;
        }
    }
    
    /**
     * 通过完整地址字符串获取经纬度坐标
     * 
     * @param fullAddress 完整地址字符串
     * @return 包含经纬度的Map，失败返回null
     */
    public Map<String, Double> getCoordinatesByFullAddress(String fullAddress) {
        try {
            if (fullAddress == null || fullAddress.trim().isEmpty()) {
                logger.warn("完整地址为空，无法获取坐标");
                return null;
            }
            
            logger.info("开始调用百度地图API解析完整地址: {}", fullAddress);
            
            // 调用百度地图正向地理编码API
            String encoded = URLEncoder.encode(fullAddress, StandardCharsets.UTF_8.name());
            String url = "https://api.map.baidu.com/geocoding/v3/?output=json&ak=" + baiduAk + "&address=" + encoded;
            
            // 使用HttpUtils发送GET请求
            String result = HttpUtils.sendGet(url);
            if (result == null || result.trim().isEmpty()) {
                logger.error("百度地图API返回结果为空");
                return null;
            }
            
            result = result.replaceAll("\n", "").replaceAll("\t", "");
            
            // 解析返回结果
            JSONObject resultJson = JSONObject.parseObject(result);
            if ("0".equals(resultJson.getString("status"))) {
                JSONObject location = resultJson.getJSONObject("result").getJSONObject("location");
                Double lng = location.getDouble("lng");
                Double lat = location.getDouble("lat");
                
                Map<String, Double> coordinates = new HashMap<>();
                coordinates.put("longitude", lng);
                coordinates.put("latitude", lat);
                
                logger.info("百度地图API解析成功: {} -> 经度={}, 纬度={}", fullAddress, lng, lat);
                return coordinates;
            } else {
                logger.error("百度地图API解析失败: {} - {}", fullAddress, resultJson.getString("msg"));
                return null;
            }
            
        } catch (Exception e) {
            logger.error("调用百度地图API失败: {} - {}", fullAddress, e.getMessage(), e);
            return null;
        }
    }
    
    /**
     * 通过经纬度获取地址信息（逆地理编码）
     * 
     * @param longitude 经度
     * @param latitude 纬度
     * @return 包含地址信息的JSONObject，失败返回null
     */
    public JSONObject getAddressByCoordinates(Double longitude, Double latitude) {
        try {
            if (longitude == null || latitude == null) {
                logger.warn("经纬度参数为空，无法获取地址");
                return null;
            }
            
            logger.info("开始调用百度地图API逆解析坐标: 经度={}, 纬度={}", longitude, latitude);
            
            // 调用百度地图逆地理编码API
            String location = longitude + "," + latitude;
            String url = "https://api.map.baidu.com/reverse_geocoding/v3/?ak=" + baiduAk + 
                        "&output=json&coordtype=wgs84ll&location=" + location;
            
            // 使用HttpUtils发送GET请求
            String result = HttpUtils.sendGet(url);
            if (result == null || result.trim().isEmpty()) {
                logger.error("百度地图API返回结果为空");
                return null;
            }
            
            result = result.replaceAll("\n", "").replaceAll("\t", "");
            
            // 解析返回结果
            JSONObject resultJson = JSONObject.parseObject(result);
            if ("0".equals(resultJson.getString("status"))) {
                logger.info("百度地图API逆解析成功: 经度={}, 纬度={}", longitude, latitude);
                return resultJson;
            } else {
                logger.error("百度地图API逆解析失败: 经度={}, 纬度={} - {}", 
                           longitude, latitude, resultJson.getString("msg"));
                return null;
            }
            
        } catch (Exception e) {
            logger.error("调用百度地图API逆解析失败: 经度={}, 纬度={} - {}", 
                        longitude, latitude, e.getMessage(), e);
            return null;
        }
    }
}
