/*
 * 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.carbondata.core.datastore;

import java.io.IOException;
import java.nio.ByteBuffer;

public interface FileReader {

  /**
   * This method will be used to reads the data to byteBuffer from file based on offset
   * and length(number of bytes) need to read
   *
   * @param filePath fully qualified file path
   * @param offset reading start position,
   * @param length number of bytes to be read
   * @return ByteBuffer
   * @throws IOException
   */
  ByteBuffer readByteBuffer(String filePath, long offset, int length)
      throws IOException;

  /**
   * This method will be used to read the byte array from file based on offset
   * and length(number of bytes) need to read
   *
   * @param filePath fully qualified file path
   * @param offset   reading start position,
   * @param length   number of bytes to be read
   * @return read byte array
   */
  byte[] readByteArray(String filePath, long offset, int length) throws IOException;

  /**
   * This method will be used to read the byte array from file based on length(number of bytes)
   *
   * @param filePath fully qualified file path
   * @param length   number of bytes to be read
   * @return read byte array
   */
  byte[] readByteArray(String filePath, int length) throws IOException;

  /**
   * This method will be used to read int from file from position(offset), here
   * length will be always 4 because int byte size if 4
   *
   * @param filePath fully qualified file path
   * @param offset   reading start position,
   * @return read int
   */
  int readInt(String filePath, long offset) throws IOException;

  /**
   * This method will be used to read long from file from position(offset), here
   * length will be always 8 because int byte size is 8
   *
   * @param filePath fully qualified file path
   * @param offset   reading start position,
   * @return read long
   */
  long readLong(String filePath, long offset) throws IOException;

  /**
   * This method will be used to read int from file from position(offset), here
   * length will be always 4 because int byte size if 4
   *
   * @param filePath fully qualified file path
   * @return read int
   */
  int readInt(String filePath) throws IOException;

  /**
   * This method will be used to read long value from file from position(offset), here
   * length will be always 8 because long byte size if 4
   *
   * @param filePath fully qualified file path
   * @param offset   reading start position,
   * @return read long
   */
  long readDouble(String filePath, long offset) throws IOException;

  /**
   * This method will be used to close all the streams currently present in the cache
   */
  void finish() throws IOException;

  /**
   * Set the flag to read data page by page instead of whole blocklet.
   *
   * @param isReadPageByPage
   */
  void setReadPageByPage(boolean isReadPageByPage);

  /**
   * Whether read the data page by page from carbondata file instead of reading whole
   * blocklet to memory. It is need in case of memory constraint operations.
   */
  boolean isReadPageByPage();

}