package org.freertr.addr;

import org.freertr.util.bits;

/**
 * stores one eui64 address
 *
 * @author matecsaba
 */
public class addrEui extends addrType {

    /**
     * create instance
     */
    public addrEui() {
    }

    /**
     * size of address
     */
    public final static int size = 8;

    public String toString() {
        return bits.toHexB(addr[0]) + bits.toHexB(addr[1]) + "-" + bits.toHexB(addr[2]) + bits.toHexB(addr[3]) + "-"
                + bits.toHexB(addr[4]) + bits.toHexB(addr[5]) + "-" + bits.toHexB(addr[6]) + bits.toHexB(addr[7]);
    }

    public addrEui copyBytes() {
        addrEui a = new addrEui();
        a.fromBuf(addr, 0);
        return a;
    }

    public boolean fromString(String s) {
        if (s.length() != toString().length()) {
            return true;
        }
        s = s.replaceAll("\\.", "-");
        s = s.replaceAll("\\:", "-");
        if (!s.substring(4, 5).endsWith("-")) {
            return true;
        }
        if (!s.substring(9, 10).endsWith("-")) {
            return true;
        }
        s = s.replaceAll("\\-", "");
        for (int i = 0; i < size; i++) {
            try {
                addr[i] = (byte) Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16);
            } catch (Exception e) {
                return true;
            }
        }
        return false;
    }

    /**
     * generate random address
     *
     * @return bytes of address
     */
    public static addrEui getRandom() {
        addrEui a = new addrEui();
        a.fillRandom();
        a.addr[0] = 0;
        return a;
    }

    public int getSize() {
        return size;
    }

    /**
     * convert to ipv6
     *
     * @param prefix prefix to prepend, null if link local
     * @return ipv6 address
     */
    public addrIPv6 toIPv6(addrIPv6 prefix) {
        addrIPv6 a;
        if (prefix == null) {
            a = new addrIPv6();
            a.addr[0] = (byte) 0xfe;
            a.addr[1] = (byte) 0x80;
        } else {
            a = prefix.copyBytes();
        }
        bits.byteCopy(addr, 0, a.addr, size, size);
        return a;
    }

    /**
     * convert from ipv6
     *
     * @param a address
     */
    public void fromIPv6(addrIPv6 a) {
        for (int i = 0; i < size; i++) {
            addr[i] = a.addr[size + i];
        }
    }

}
