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

import io.netty.buffer.ArrowBuf;

import java.util.Collections;
import java.util.Iterator;

import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.memory.OutOfMemoryException;
import org.apache.arrow.vector.complex.impl.NullReader;
import org.apache.arrow.vector.complex.reader.FieldReader;
import org.apache.arrow.vector.types.MaterializedField;
import org.apache.arrow.vector.types.Types;
import org.apache.arrow.vector.types.Types.MinorType;
import org.apache.arrow.vector.util.TransferPair;

import com.google.common.collect.Iterators;

public class ZeroVector implements ValueVector {
  public final static ZeroVector INSTANCE = new ZeroVector();

  private final MaterializedField field = MaterializedField.create("[DEFAULT]", Types.required(MinorType.LATE));

  private final TransferPair defaultPair = new TransferPair() {
    @Override
    public void transfer() { }

    @Override
    public void splitAndTransfer(int startIndex, int length) { }

    @Override
    public ValueVector getTo() {
      return ZeroVector.this;
    }

    @Override
    public void copyValueSafe(int from, int to) { }
  };

  private final Accessor defaultAccessor = new Accessor() {
    @Override
    public Object getObject(int index) {
      return null;
    }

    @Override
    public int getValueCount() {
      return 0;
    }

    @Override
    public boolean isNull(int index) {
      return true;
    }
  };

  private final Mutator defaultMutator = new Mutator() {
    @Override
    public void setValueCount(int valueCount) { }

    @Override
    public void reset() { }

    @Override
    public void generateTestData(int values) { }
  };

  public ZeroVector() { }

  @Override
  public void close() { }

  @Override
  public void clear() { }

  @Override
  public MaterializedField getField() {
    return field;
  }

  @Override
  public TransferPair getTransferPair(BufferAllocator allocator) {
    return defaultPair;
  }

//  @Override
//  public UserBitShared.SerializedField getMetadata() {
//    return getField()
//        .getAsBuilder()
//        .setBufferLength(getBufferSize())
//        .setValueCount(getAccessor().getValueCount())
//        .build();
//  }

  @Override
  public Iterator<ValueVector> iterator() {
    return Collections.emptyIterator();
  }

  @Override
  public int getBufferSize() {
    return 0;
  }

  @Override
  public int getBufferSizeFor(final int valueCount) {
    return 0;
  }

  @Override
  public ArrowBuf[] getBuffers(boolean clear) {
    return new ArrowBuf[0];
  }

  @Override
  public void allocateNew() throws OutOfMemoryException {
    allocateNewSafe();
  }

  @Override
  public boolean allocateNewSafe() {
    return true;
  }

  @Override
  public BufferAllocator getAllocator() {
    throw new UnsupportedOperationException("Tried to get allocator from ZeroVector");
  }

  @Override
  public void setInitialCapacity(int numRecords) { }

  @Override
  public int getValueCapacity() {
    return 0;
  }

  @Override
  public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
    return defaultPair;
  }

  @Override
  public TransferPair makeTransferPair(ValueVector target) {
    return defaultPair;
  }

  @Override
  public Accessor getAccessor() {
    return defaultAccessor;
  }

  @Override
  public Mutator getMutator() {
    return defaultMutator;
  }

  @Override
  public FieldReader getReader() {
    return NullReader.INSTANCE;
  }

//  @Override
//  public void load(UserBitShared.SerializedField metadata, DrillBuf buffer) { }
}
