package com.ruoyi.common.utils;

import com.google.gson.Gson;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

// IP 归属地响应实体（与 API 返回字段对应）
class IpApiResponse {
    private String status; // 响应状态：success/fail
    private String country; // 国家（英文，如 China）
    private String countryCode; // 国家代码（如 CN）
    private String message; // 错误信息（失败时返回）

    // getter 方法（Gson 反射解析需要）
    public String getStatus() { return status; }
    public String getCountry() { return country; }
    public String getCountryCode() { return countryCode; }
    public String getMessage() { return message; }
}

public class IpCountryQueryByApi {
    // 在线 API 地址（支持 IPv4/IPv6，lang=zh-CN 可返回中文国家名）
    private static final String IP_API_URL = "http://ip-api.com/json/%s?lang=zh-CN";
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder()
            .connectTimeout(5, TimeUnit.SECONDS) // 连接超时
            .readTimeout(5, TimeUnit.SECONDS)    // 读取超时
            .build();
    private static final Gson GSON = new Gson();

    /**
     * 查询 IP 归属国家
     * @param ip 目标 IP 地址（如 "113.110.241.1"）
     * @return 国家名称（如 "中国"），失败返回 "未知"
     */
    public static String getIpCountry(String ip) {
        // 校验 IP 格式（简单校验，可根据需求完善）
        if (ip == null || ip.trim().isEmpty() || isPrivateIp(ip)) {
            return "未知";
        }

        String url = String.format(IP_API_URL, ip.trim());
        Request request = new Request.Builder().url(url).build();

        try (Response response = HTTP_CLIENT.newCall(request).execute()) {
            if (!response.isSuccessful() || response.body() == null) {
                return "未知";
            }
            // 解析 JSON 响应
            IpApiResponse apiResponse = GSON.fromJson(response.body().string(), IpApiResponse.class);
            if ("success".equals(apiResponse.getStatus())) {
                return apiResponse.getCountry(); // 返回中文国家名（如 "中国"）
            } else {
                System.err.println("IP 查询失败：" + apiResponse.getMessage());
                return "未知";
            }
        } catch (IOException e) {
            System.err.println("IP 查询网络异常：" + e.getMessage());
            return "未知";
        }
    }

    /**
     * 判断是否为内网 IP（IPv4）
     */
    private static boolean isPrivateIp(String ip) {
        String[] parts = ip.split("\\.");
        if (parts.length != 4) {
            return false; // 非 IPv4 暂不判断
        }
        int first = Integer.parseInt(parts[0]);
        int second = Integer.parseInt(parts[1]);
        // 内网 IP 段：10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
        return (first == 10)
                || (first == 172 && second >= 16 && second <= 31)
                || (first == 192 && second == 168);
    }

    // 测试
//    public static void main(String[] args) {
//        System.out.println(getIpCountry("113.110.241.1")); // 输出：中国
//        System.out.println(getIpCountry("8.8.8.8"));       // 输出：美国
//        System.out.println(getIpCountry("192.168.1.1"));  // 输出：未知（内网 IP）
//        System.out.println(getIpCountry("2001:4860:4860::8888")); // 输出：美国（IPv6）
//    }
}
