package commandlineadaptor;
import adaptorlib.Adaptor;
import adaptorlib.Config;
import adaptorlib.DocId;
import adaptorlib.GsaCommunicationHandler;
import adaptorlib.ScheduleOncePerDay;

import adaptorlib.Command;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * Command Line Adaptor
 */
class CommandLineAdaptor extends Adaptor {
  private final static Logger LOG = Logger.getLogger(CommandLineAdaptor.class.getName());
  private Charset encoding = Charset.forName("UTF-8");

  @Override
  public List<DocId> getDocIds() throws IOException {
    int commandResult;
    Command command = new Command();
    
    try {
      LOG.finest("Command: ./list-doc-ids-filesystem.sh");
      commandResult = command.exec(new String[] {"./list-doc-ids-filesystem.sh"});
    } catch (InterruptedException e) {
      throw new IOException("Thread interrupted while waiting for external command.", e);
    } catch (IOException e) {
      throw new IOException("External command could not be executed.", e);
    }
    if (commandResult != 0) {
      throw new IOException("External command error. code = " + commandResult + ".");
    } else {
      String docIdString = new String(command.getStdout(), encoding);
      ArrayList<DocId> docIds = new ArrayList<DocId>();
      for (String docId : docIdString.split("\n")) {
        docIds.add(new DocId(docId));
        LOG.finest("Pushing Doc ID: '" + docId + "'");
      }
      return docIds;
    }
  }

  /** Gives the bytes of a document referenced with id. */
  @Override
  public byte[] getDocContent(DocId id) throws IOException {
    int commandResult;
    Command command = new Command();
    
    try {
      LOG.finest("Command: ./get-doc-contents-filesystem.sh " + id.getUniqueId());
      commandResult = command.exec(new String[] {"./get-doc-contents-filesystem.sh", id.getUniqueId()});
    } catch (InterruptedException e) {
      throw new IOException("Thread intrupted while waiting for external command.", e);
    } catch (IOException e) {
      throw new IOException("External command could not be executed.", e);
    }
    if (commandResult == 2) {
      throw new FileNotFoundException("Document not found.");
    } else if (commandResult != 0) {
      throw new IOException("External command error. code=" + commandResult + ".");
    } else {
      LOG.finest("Returning document contents for ID '" + id.getUniqueId() + ".");
      return command.getStdout();
    }
  }

  /** An example main for an adaptor that enables serving. */
  public static void main(String a[]) throws InterruptedException {
    Config config = new Config();
    config.autoConfig(a);
    Adaptor adaptor = new CommandLineAdaptor();
    GsaCommunicationHandler gsa = new GsaCommunicationHandler(adaptor, config);

    // Setup providing content.
    try {
      gsa.beginListeningForContentRequests();
      LOG.info("doc content serving started");
    } catch (IOException e) {
      throw new RuntimeException("could not start serving", e);
    }

    // Push once at program start.
    gsa.pushDocIds();

    // Setup regular pushing of doc ids for once per day.
    gsa.beginPushingDocIds(
      new ScheduleOncePerDay(/*hour*/3, /*minute*/0, /*second*/0));
    LOG.info("doc id pushing has been put on schedule");
  }
}
