/*
 * 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.mnemonic.bench;

import org.apache.mnemonic.DurableType;
import org.apache.mnemonic.EntityFactoryProxy;
import org.apache.mnemonic.Utils;
import org.apache.mnemonic.VolatileMemAllocator;
import org.apache.mnemonic.service.memory.internal.SysVMemServiceImpl;
import org.apache.mnemonic.collections.DurableSinglyLinkedList;
import org.apache.mnemonic.collections.DurableSinglyLinkedListFactory;
import org.apache.mnemonic.collections.SinglyLinkedNode;
import org.apache.mnemonic.collections.SinglyLinkedNodeFactory;
import org.apache.mnemonic.service.computing.GeneralComputingService;
import org.apache.mnemonic.service.computing.ValueInfo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class DNCSTextFileSort implements TextFileSort {
  private String uri = "";
  private VolatileMemAllocator m_act = null;
  private DurableType[] elem_gftypes = {DurableType.LONG};
  private EntityFactoryProxy[] elem_efproxies = null;
  private Long head;
  private long[] sortinfo = new long[3];
  private long[][] ostack;

  public DNCSTextFileSort() {
  }

  @Override
  public void load(BufferedReader reader) throws NumberFormatException, IOException {
    if (null != m_act) {
      clear();
    }
    m_act = new VolatileMemAllocator(new SysVMemServiceImpl(), 1024 * 1024 * 1024 * 5,
        uri);
    String text = null;
    SinglyLinkedNode<Long> curnode = null, prvnode = null, node = null;
    Long val;
    while ((text = reader.readLine()) != null) {
      val = Long.parseLong(text);
      curnode = SinglyLinkedNodeFactory.create(m_act, elem_efproxies, elem_gftypes, false);
      curnode.setItem(val, false);
      if (null == prvnode) {
        this.head = curnode.getHandler();
        this.ostack = curnode.getNativeFieldInfo();
      } else {
        prvnode.setNext(curnode, false);
      }
      prvnode = curnode;
    }
  }

  @Override
  public void doSort() {
    GeneralComputingService gcsvr = Utils.getGeneralComputingService("sort");
    ValueInfo vinfo = new ValueInfo();
    List<long[][]> objstack = new ArrayList<long[][]>();
    objstack.add(this.ostack);
    long[][] fidinfostack = {{2L, 1L}};
    vinfo.handler = this.head;
    vinfo.transtable = m_act.getTranslateTable();
    vinfo.dtype = DurableType.LONG;
    vinfo.frames = Utils.genNativeParamForm(objstack, fidinfostack);
    ValueInfo[] vinfos = {vinfo};
    long[] ret = gcsvr.perform("1dlong_bubble", vinfos);
    this.head = ret[0];
    this.sortinfo[0] = ret[1];
    this.sortinfo[1] = ret[2];
    this.sortinfo[2] = ret[3];
  }

  @Override
  public void store(BufferedWriter writer) throws IOException {
    DurableSinglyLinkedList<Long> linkvals = DurableSinglyLinkedListFactory.restore(m_act,
        elem_efproxies, elem_gftypes, this.head, false);
    Iterator<Long> elemiter = linkvals.iterator();
    Long val;
    while (elemiter.hasNext()) {
      val = elemiter.next();
      writer.write(val.toString());
      writer.newLine();
    }
  }

  @Override
  public long[] getSortInfo() {
    return this.sortinfo;
  }

  @Override
  public void clear() {
    m_act.close();
  }
}
