package org.artisanlogiciel.games.maze.persist;

import org.artisanlogiciel.games.maze.LabyModel;

import java.io.*;

public class MazePersistRaw
{
    private LabyModel model;

    public MazePersistRaw(LabyModel model)
    {
        this.model = model;
    }

    public MazePersistRaw()
    {
        this.model = model;
    }


    public void streamOut(String pFormat, OutputStream pOut) throws IOException {
        if ((pFormat == null) || (pFormat.equals("raw"))) {
            // first raw format, not smart.
            DataOutputStream dataOut = new DataOutputStream(pOut);
            // should dump this to stream.
            dataOut.write(new byte[]{(byte) 'L', (byte) 'A', (byte) 'B', (byte) '0'});
            dataOut.writeInt(model.getWidth());
            dataOut.writeInt(model.getHeight());
            dataOut.flush();
            for (int y = 0; y < model.getHeight(); y++) {
                for (int x = 0; x < model.getWidth(); x++) {
                    dataOut.writeShort(model.getPath(x,y));
                }
            }
            dataOut.flush();
        } else {
            throw new IOException("Format " + pFormat + " Not yet implemented.");
        }
    }


    public LabyModel parseInputStream(String pFormat, InputStream pIn) throws IOException {
        if ((pFormat == null) || (pFormat.equals("raw"))) {
            // maxdepth is unset then unmodified
            byte[] header = new byte[4];
            DataInputStream in = new DataInputStream(pIn);
            in.read(header);
            int rwidth = in.readInt();
            int rheight = in.readInt();
            if ((rwidth > 0) && (rheight > 0)) {
                int width = rwidth;
                int height = rheight;
                // SHOULD CHECK max width and max height...
                // CLEAR == 0 and array is initialized with 0s
                short[][] t = new short[width][height];
                for (int y = 0; y < height; y++) {
                    for (int x = 0; x < width; x++) {
                        t[x][y] = in.readShort();
                    }
                }
                model= new LabyModel(width, height, t);
                return model;
            } else {
                throw new IOException("Invalid header for width and height");
            }
            // should be at end of stream ? Not necessary can stream multiple
            // labs ( or tiling ).
        } else {
            throw new IOException("Format " + pFormat + " Not yet implemented.");
        }

    }

}
