package org.projectfloodlight.openflow.types;


public abstract class IPAddressWithMask<F extends IPAddress<F>> extends Masked<F> {

    protected IPAddressWithMask(F value, F mask) {
        super(value, mask);
    }

    public abstract IPVersion getIpVersion();

    public F getSubnetBroadcastAddress() {
        if (!mask.isCidrMask()) {
            throw new IllegalArgumentException("Mask Invalid " + mask +
                                               " cannot get subnet for non CIDR mask");
        }
        return value.or(mask.not());
    }

    public boolean isSubnetBroadcastAddress(F candidate) {
        return getSubnetBroadcastAddress().equals(candidate);
    }

    public static IPAddressWithMask<?> of(String ip) {
        if (ip == null) {
            throw new NullPointerException("String ip must not be null");
        }
        if (ip.indexOf('.') != -1)
            return IPv4AddressWithMask.of(ip);
        else if (ip.indexOf(':') != -1)
            return IPv6AddressWithMask.of(ip);
        else
            throw new IllegalArgumentException("IP Address not well formed: " + ip);
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(value.toString());

        res.append('/');
        if (mask.isCidrMask()) {
            // CIDR notation
            res.append(mask.asCidrMaskLength());
        } else {
            // Full address mask
            res.append(mask.toString());
        }

        return res.toString();
    }

}
