<?php

namespace common\libs;

use Yii;
use yii\base\Component;
use yii\web\BadRequestHttpException;
use yii\web\Application;
use MaxMind\Db\Reader;
use MaxMind\Db\InvalidDatabaseException;
use MaxMind\Db\AddressNotFoundException;
use common\helpers\LoggerTool;
class IpFilter
{
    /**
     * @throws BadRequestHttpException
     * @return bool
     */
    public function frontApiCheck($source, $isLogin = false)
    {
        $request = Yii::$app->request;
        $getParams = Yii::$app->request->get();
        $postParams = Yii::$app->request->post();
        $remoteAddr = $_SERVER['REMOTE_ADDR']; // 获取用户 IP 地址

        //如果IP不在指定范围内
        if (!self::remoteAddrCall($remoteAddr)) {
            $logPreix = $isLogin ? 'nc_ip_filter_login' : 'nc_ip_filter_other';
            $getLog = sprintf('%s_%s: remote_ip%s: url(%s): param%s', $source, $logPreix, $remoteAddr, $request->getAbsoluteUrl(), (is_array($getParams) ? json_encode($getParams) : $getParams));
            $postLog = sprintf('%s_%s: remote_ip%s: url(%s): param%s', $source, $logPreix, $remoteAddr, $request->getAbsoluteUrl(), (is_array($postParams) ? json_encode($postParams) : $postParams));
            //$logPreix . ':remote_ip' . $remoteAddr . ':' . $request->getAbsoluteUrl() . ':' . (is_array($getParams) ? json_encode($getParams) : $getParams);
            //$logPreix . ':remote_ip' . $remoteAddr . ':' . $request->getAbsoluteUrl() . ':' . (is_array($postParams) ? json_encode($postParams) : $postParams);
            LoggerTool::error($getLog);
            LoggerTool::error($postLog);
            return false;
        }

        return true;
    }

    /**
     * 判断IP是否在指定范围内
     * @throws AddressNotFoundException
     * @throws InvalidDatabaseException
     */
    public static function remoteAddrCall($remoteAddr): bool
    {
        // 是否有效的IP
        if (!filter_var($remoteAddr, FILTER_VALIDATE_IP)) {
            return false;
        }

        // 替换为 GeoLite2 数据库文件的实际路径
        $dbPath = \Yii::getAlias('@common/runtime/geoLite//GeoLite2-Country.mmdb');
        // 初始化 MaxMind 数据库读取器
        $reader = new \GeoIp2\Database\Reader($dbPath);
        // 查询 IP 地址的地理位置
        $record = $reader->country($remoteAddr);
        // 返回国家名称
        $countryName = $record->country->name;
        if (!in_array($countryName, ['China', 'Malaysia'])) {
            return false;
        }

        return true;
    }
}