package gov.nasa.gsfc.spdf.cdfj;
import java.nio.*;

/**
 *
 * @author nand
 */
public class StringArray extends AArray {

    /**
     *
     * @param o
     * @throws Throwable
     */
    public StringArray(Object o) throws Throwable {
        super(o);
    }

    /**
     *
     * @param o
     * @param bln
     * @throws Throwable
     */
    public StringArray(Object o, boolean majority) throws Throwable {
        super(o, majority);
    }

    /**
     *
     * @return
     */
    @Override
    public Object array() {
        switch (dim) {
        case 1:
            String[] _s1 = (String[])o;
            return (String[])o;
        case 2:
            return (String[][])o;
        case 3:
            return (String[][][])o;
        case 4:
            return (String[][][][])o;
        }
        return null;
    }
    
    /**
     * create a byte buffer of a compatible type.
     */
    @Override
    public ByteBuffer buffer(Class<?> cl, int size) throws Throwable {
        if (!(cl == String.class)) {
            throw new Throwable("Valid for String type only");
        }
        if (dim > 4) throw new Throwable("Rank > 4 not supported");
        ByteBuffer buf = allocate(size);
        int[] _dim = aa.getDimensions();
        switch (dim) {
        case 1:
            String[] _s1 = (String[])o;
            addString(buf, _s1, size);
            buf.flip();
            return buf;
        case 2:
            String[][] _s2 = (String[][])o;
            for (int i = 0; i < _dim[0]; i++) addString(buf, _s2[i], size);
            buf.flip();
            return buf;
        case 3:
            String[][][] _s3 = (String[][][])o;
            if (rowMajority) {
                for (int i = 0; i < _dim[0]; i++) {
                    for (int j = 0; j < _dim[1]; j++) {
                        addString(buf, _s3[i][j], size);
                    }
                }
            } else {
                for (int i = 0; i < _dim[0]; i++) {
                    for (int k = 0; k < _dim[2]; k++) {
                        for (int j = 0; j < _dim[1]; j++) {
                            addString(buf, _s3[i][j][k], size);
                        }
                    }
                }
            }
            buf.flip();
            return buf;
        case 4:
            String[][][][] _s4 = (String[][][][])o;
            if (rowMajority) {
                for (int i = 0; i < _dim[0]; i++) {
                    for (int j = 0; j < _dim[1]; j++) {
                        for (int k = 0; k < _dim[2]; k++) {
                            addString(buf, _s4[i][j][k], size);
                        }
                    }
                }
            } else {
                for (int i = 0; i < _dim[0]; i++) {
                    for (int l = 0; l < _dim[3]; l++) {
                        for (int k = 0; k < _dim[2]; k++) {
                            for (int j = 0; j < _dim[1]; j++) {
                                addString(buf, _s4[i][j][k][l], size);
                            }
                        }
                    }
                }
            }
            buf.flip();
            return buf;
        }
        return null;
    }

    void addString(ByteBuffer buf, String[] sa, int max) throws Throwable {
        for (String sa1 : sa) {
            addString(buf, sa1, max);
        }
    }
/*
    void addString(ByteBuffer buf, String[] sa, int max) throws Throwable {
        for (int i = 0; i < sa.length; i++) {
            int len = sa[i].length();
            if (len > max) throw new Throwable("String " + sa[i] +
                " is longer than the specified max " + max);
            byte[] _bar = sa[i].getBytes();
            buf.put(_bar);
            for (int f = 0; f < (max - _bar.length); f++) {
                buf.put((byte)0x20);
            }
        }
    }
*/
    void addString(ByteBuffer buf, String s, int max) throws Throwable {
        int len = s.length();
        if (len > max) throw new Throwable("String " + s +
            " is longer than the specified max " + max);
        byte[] _bar = s.getBytes();
        buf.put(_bar);
        for (int f = 0; f < (max - _bar.length); f++) {
            buf.put((byte)0x20);
        }
    }
}
