<?php
 
namespace App\Rules;
 
use Illuminate\Contracts\Validation\Rule;

class Cidr implements Rule
{

    protected $flags = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;

    public function __construct(int $_filter = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
    {
        $this->flags = $_filter;
    }

    public static function make(int $_filter)
    {
        return new static($_filter);
    }

    public function passes($attribute, $value)
    {
        // Determine if it is valid CIDR
        $valid = false;
        $simple_addr = $value;

        if(str_contains($value, '/')) {
            [$address, $mask] = explode('/', $value);

            $simple_addr = $address;
            
            if(str_contains($address, '.')) {
                $valid = boolval(filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | $this->flags)) && $mask > 0 && $mask <= 32;
            }
            else {
                $valid = boolval(filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | $this->flags))  && $mask > 0 && $mask <= 128;
            }
        }
        else {
            if(str_contains($value, '.')) {
                $valid = boolval(filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | $this->flags));
            }
            else {
                $valid = boolval(filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | $this->flags));
            }
        }

        return $valid;
    }
 
    public function message()
    {
        return 'The :attribute must be a valid CIDR.';
    }
}