<?php
/**
 * PHP class to get user IP.
 *
 * @author    MASNathan - <https://github.com/MASNathan>
 * @author    Josantonius - <hello@josantonius.com>
 * @copyright 2017 - 2018 (c) Josantonius - PHP-Ip
 * @license   https://opensource.org/licenses/MIT - The MIT License (MIT)
 * @link      https://github.com/Josantonius/PHP-Ip
 * @since     1.0.0
 */
namespace Josantonius\Ip;

/**
 * IP handler.
 */
class Ip
{
    /**
     * Get user's IP.
     *
     * @return string|false → user IP
     */
    public static function get()
    {
        $possibleKeys = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED',
            'HTTP_X_CLUSTER_CLIENT_IP',
            'HTTP_FORWARDED_FOR',
            'HTTP_FORWARDED',
            'HTTP_VIA',
            'HTTP_X_COMING_FROM',
            'HTTP_COMING_FROM',
            'HTTP_X_REAL_IP',
            'REMOTE_ADDR',
        ];

        foreach ($possibleKeys as $key) {
            if ($ip = static::getGlobalValue($key)) {
                return $ip;
            }
        }

        return false;
    }

    /**
     * Validate IP.
     *
     * @since 1.1.2
     *
     * @param string $ip → IP address to be validated
     *
     * @return bool
     */
    public static function validate($ip)
    {
        return filter_var($ip, FILTER_VALIDATE_IP) ? true : false;
    }

    /**
     * Gets the key value from globals.
     *
     * @since 1.1.4
     *
     * @param string $key
     *
     * @return string|null
     */
    protected static function getGlobalValue($key)
    {
        if (isset($_SERVER[$key]) && static::validate($_SERVER[$key])) {
            return $_SERVER[$key];
        }

        if (isset($_ENV[$key]) && static::validate($_ENV[$key])) {
            return $_ENV[$key];
        }

        if (@getenv($key) && static::validate(getenv($key))) {
            return getenv($key);
        }

        return null;
    }
}