/**
 * 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();
    }

}
