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 IPAddress<?> 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(IPAddress<?> 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();
    }

}
