/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hcatalog.data;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.hadoop.io.VIntWritable;
import org.apache.hadoop.io.VLongWritable;


public abstract class ReaderWriter {

  private static final String UTF8 = "UTF-8";

  public static Object readDatum(DataInput in) throws IOException {

    byte type = in.readByte();
    switch (type) {

    case DataType.STRING:
      byte[] buffer = new byte[in.readInt()];
      in.readFully(buffer);
      return new String(buffer,UTF8);

    case DataType.INTEGER:
      VIntWritable vint = new VIntWritable();
      vint.readFields(in);
      return vint.get();

    case DataType.LONG:
      VLongWritable vlong = new VLongWritable();
      vlong.readFields(in);
      return vlong.get();

    case DataType.FLOAT:
      return in.readFloat();

    case DataType.DOUBLE:
      return in.readDouble();

    case DataType.BOOLEAN:
      return in.readBoolean();

    case DataType.BYTE:
      return in.readByte();

    case DataType.SHORT:
      return in.readShort();

    case DataType.NULL:
      return null;
      
    case DataType.BINARY:
      int len = in.readInt();
      byte[] ba = new byte[len];
      in.readFully(ba);
      return ba;
      
    case DataType.MAP:
      int size = in.readInt();
      Map<Object,Object> m = new HashMap<Object, Object>(size);
      for (int i = 0; i < size; i++) {
          m.put(readDatum(in), readDatum(in));
      }
      return m;

    case DataType.LIST:
      int sz = in.readInt();
      List<Object> list = new ArrayList<Object>(sz);
      for(int i=0; i < sz; i++) {
        list.add(readDatum(in));
      }
      return list;

    default:
      throw new IOException("Unexpected data type " + type +
          " found in stream.");
    }
  }

  public static void writeDatum(DataOutput out, Object val) throws IOException {
    // write the data type
    byte type = DataType.findType(val);
    switch (type) {
    case DataType.LIST:
      out.writeByte(DataType.LIST);
      List<?> list = (List<?>)val;
      int sz = list.size();
      out.writeInt(sz);
      for (int i = 0; i < sz; i++) {
        writeDatum(out, list.get(i));
      }
      return;

    case DataType.MAP:
      out.writeByte(DataType.MAP);
      Map<?,?> m = (Map<?, ?>)val;
      out.writeInt(m.size());
      Iterator<?> i =
        m.entrySet().iterator();
      while (i.hasNext()) {
        Entry<?,?> entry = (Entry<?, ?>) i.next();
        writeDatum(out, entry.getKey());
        writeDatum(out, entry.getValue());
      }
      return;

    case DataType.INTEGER:
      out.writeByte(DataType.INTEGER);
      new VIntWritable((Integer)val).write(out);
      return;

    case DataType.LONG:
      out.writeByte(DataType.LONG);
      new VLongWritable((Long)val).write(out);
      return;

    case DataType.FLOAT:
      out.writeByte(DataType.FLOAT);
      out.writeFloat((Float)val);
      return;

    case DataType.DOUBLE:
      out.writeByte(DataType.DOUBLE);
      out.writeDouble((Double)val);
      return;

    case DataType.BOOLEAN:
      out.writeByte(DataType.BOOLEAN);
      out.writeBoolean((Boolean)val);
      return;

    case DataType.BYTE:
      out.writeByte(DataType.BYTE);
      out.writeByte((Byte)val);
      return;

    case DataType.SHORT:
      out.writeByte(DataType.SHORT);
      out.writeShort((Short)val);
      return;

    case DataType.STRING:
      String s = (String)val;
      byte[] utfBytes = s.getBytes(ReaderWriter.UTF8);
      out.writeByte(DataType.STRING);
      out.writeInt(utfBytes.length);
      out.write(utfBytes);
      return;

    case DataType.BINARY:
      byte[] ba = (byte[])val;
      out.writeByte(DataType.BINARY);
      out.writeInt(ba.length);
      out.write(ba);
      return;
      
    case DataType.NULL:
      out.writeByte(DataType.NULL);
      return;

    default:
      throw new IOException("Unexpected data type " + type +
          " found in stream.");
    }
  }
}
