/**
 * 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 com.datatorrent.lib.io.fs;

import java.io.IOException;
import java.util.LinkedList;

import javax.validation.constraints.NotNull;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import com.google.common.base.Preconditions;

import com.datatorrent.api.Context;
import com.datatorrent.api.DefaultInputPort;
import com.datatorrent.api.Operator;

/**
 * A file splitter that receives its input from an upstream operator.
 *
 * @since 3.2.0
 */
public class FileSplitterBase extends AbstractFileSplitter implements Operator.IdleTimeHandler
{
  @NotNull
  protected String file;
  protected transient FileSystem fs;

  protected final LinkedList<FileInfo> fileInfos;
  protected transient int sleepTimeMillis;

  public FileSplitterBase()
  {
    fileInfos = new LinkedList<>();
  }

  public final transient DefaultInputPort<FileInfo> input = new DefaultInputPort<FileInfo>()
  {
    @Override
    public void process(FileInfo fileInfo)
    {
      fileInfos.add(fileInfo);
      FileSplitterBase.this.process();
    }
  };

  @Override
  public void setup(Context.OperatorContext context)
  {
    sleepTimeMillis = context.getValue(Context.OperatorContext.SPIN_MILLIS);
    try {
      fs = getFSInstance();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    super.setup(context);
  }

  protected FileSystem getFSInstance() throws IOException
  {
    return FileSystem.newInstance(new Path(file).toUri(), new Configuration());
  }

  @Override
  protected FileInfo getFileInfo()
  {
    if (fileInfos.size() > 0) {
      return fileInfos.remove();
    }
    return null;
  }

  @Override
  public void handleIdleTime()
  {
    if (blockCount < blocksThreshold && (blockMetadataIterator != null || fileInfos.size() > 0)) {
      process();
    } else {
      /* nothing to do here, so sleep for a while to avoid busy loop */
      try {
        Thread.sleep(sleepTimeMillis);
      } catch (InterruptedException ie) {
        throw new RuntimeException(ie);
      }
    }
  }

  @Override
  public void teardown()
  {
    super.teardown();
    try {
      fs.close();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  protected long getDefaultBlockSize()
  {
    return fs.getDefaultBlockSize(new Path(file));
  }

  @Override
  protected FileStatus getFileStatus(Path path) throws IOException
  {
    return fs.getFileStatus(path);
  }

  /**
   * File path from which the File System is inferred.
   *
   * @param file files
   */
  public void setFile(@NotNull String file)
  {
    this.file = Preconditions.checkNotNull(file, "file path");
  }

  /**
   * @return file path from which the File System is inferred.
   */
  public String getFile()
  {
    return file;
  }
}
