/**
 * 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.hcatalog.common.HCatException;
import org.apache.hcatalog.data.schema.HCatSchema;

public class DefaultHCatRecord extends HCatRecord {

    private List<Object> contents;

    public DefaultHCatRecord(){
        contents = new ArrayList<Object>();
    }

    public DefaultHCatRecord(int size){
        contents = new ArrayList<Object>(size);
        for(int i=0; i < size; i++){
            contents.add(null);
        }
    }

    @Override
    public void remove(int idx) throws HCatException {
      contents.remove(idx);
    }

    public DefaultHCatRecord(List<Object> list) {
        contents = list;
    }

    @Override
    public Object get(int fieldNum) {
        return contents.get(fieldNum);
    }

    @Override
    public List<Object> getAll() {
        return contents;
    }

    @Override
    public void set(int fieldNum, Object val) {
        contents.set(fieldNum, val);
    }

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

    @Override
    public void readFields(DataInput in) throws IOException {

        contents.clear();
        int len = in.readInt();
        for(int i =0; i < len; i++){
            contents.add(ReaderWriter.readDatum(in));
        }
    }

    @Override
    public void write(DataOutput out) throws IOException {
        int sz = size();
        out.writeInt(sz);
        for (int i = 0; i < sz; i++) {
            ReaderWriter.writeDatum(out, contents.get(i));
        }

    }

    @Override
    public int hashCode() {
        int hash = 1;
        for (Object o : contents) {
            if (o != null) {
                hash = 31 * hash + o.hashCode();
            }
        }
        return hash;
    }

    @Override
    public String toString() {

        StringBuilder sb = new StringBuilder();
        for(Object o : contents) {
            sb.append(o+"\t");
        }
        return sb.toString();
    }

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

    @Override
    public void set(String fieldName, HCatSchema recordSchema, Object value) throws HCatException {
        set(recordSchema.getPosition(fieldName),value);
    }

    @Override
    public void copy(HCatRecord r) throws HCatException {
      this.contents = r.getAll();
    }

}
