/**
 * 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.List;

import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructField;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hcatalog.common.HCatException;
import org.apache.hcatalog.data.schema.HCatSchema;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * An implementation of HCatRecord that wraps an Object returned by a SerDe
 * and an ObjectInspector.  This delays deserialization of unused columns.
 */
public class LazyHCatRecord extends HCatRecord {

  public static final Logger LOG = LoggerFactory.getLogger(LazyHCatRecord.class.getName());

  private Object wrappedObject;
  private StructObjectInspector soi;
  
  @Override
  public Object get(int fieldNum) {
    try {
      StructField fref = soi.getAllStructFieldRefs().get(fieldNum);
      return HCatRecordSerDe.serializeField(
          soi.getStructFieldData(wrappedObject, fref),
          fref.getFieldObjectInspector());
    } catch (SerDeException e) {
      throw new IllegalStateException("SerDe Exception deserializing",e);
    }
  }
  

  @Override
  public List<Object> getAll() {
    
    List<Object> r = new ArrayList<Object>(this.size());
    for (int i = 0; i < this.size(); i++){
      r.add(i, get(i));
    }
    return r;
  }

  @Override
  public void set(int fieldNum, Object value) {
    throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
  }

  @Override
  public int size() {
    return soi.getAllStructFieldRefs().size();
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
        + " an object/object inspector as a HCatRecord "
        + "- it does not need to be read from DataInput.");
  }

  @Override
  public void write(DataOutput out) throws IOException {
    throw new UnsupportedOperationException("LazyHCatRecord is intended to wrap"
        + " an object/object inspector as a HCatRecord "
        + "- it does not need to be written to a DataOutput.");
  }

  @Override
  public Object get(String fieldName, HCatSchema recordSchema)
      throws HCatException {
    int idx = recordSchema.getPosition(fieldName);
    return get(idx);
  }

  @Override
  public void set(String fieldName, HCatSchema recordSchema, Object value)
      throws HCatException {
    throw new UnsupportedOperationException("not allowed to run set() on LazyHCatRecord");
  }

  @Override
  public void remove(int idx) throws HCatException {
    throw new UnsupportedOperationException("not allowed to run remove() on LazyHCatRecord");
  }

  @Override
  public void copy(HCatRecord r) throws HCatException {
    throw new UnsupportedOperationException("not allowed to run copy() on LazyHCatRecord");
  }
  
  public LazyHCatRecord(Object wrappedObject, ObjectInspector oi) throws Exception {
    if (oi.getCategory() != Category.STRUCT) {
      throw new SerDeException(getClass().toString() + " can only make a lazy hcat record from " +
          "objects of struct types, but we got: " + oi.getTypeName());
    }

    this.soi = (StructObjectInspector)oi;
    this.wrappedObject = wrappedObject;
  }

  @Override
  public String toString(){
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i< size() ; i++) {
      sb.append(get(i)+"\t");
    }
    return sb.toString();
  }

  /**
   * Convert this LazyHCatRecord to a DefaultHCatRecord.  This is required
   * before you can write out a record via write.
   * @return an HCatRecord that can be serialized
   * @throws HCatException
   */
  public HCatRecord getWritable() throws HCatException {
    DefaultHCatRecord d = new DefaultHCatRecord();
    d.copy(this);
    return d;
  }

}
