package io.dashbase.clue.commands;

import io.dashbase.clue.ClueContext;
import io.dashbase.clue.LuceneContext;
import io.dashbase.clue.util.DocIdMatcher;
import io.dashbase.clue.util.MatchSomeDocsQuery;
import io.dashbase.clue.util.MatcherDocIdSetIterator;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.Namespace;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.Query;

import java.io.PrintStream;

public class IndexTrimCommand extends ClueCommand {

  private final LuceneContext ctx;

  public IndexTrimCommand(LuceneContext ctx) {
    super(ctx);
    this.ctx = ctx;
  }

  @Override
  public String getName() {
    return "trim";
  }

  @Override
  public String help() {
    return "trims the index, <TRIM PERCENTAGE>"; 
  }
  
  private static Query buildDeleteQuery(final int percentToDelete, int maxDoc) {
    assert percentToDelete >= 0 && percentToDelete <= 100;
    return new MatchSomeDocsQuery(new MatcherDocIdSetIterator(DocIdMatcher.newRandomMatcher(percentToDelete), maxDoc));
  }

  @Override
  protected ArgumentParser buildParser(ArgumentParser parser) {
    parser.addArgument("-p", "--percent").type(Integer.class)
            .required(true).help("percent to trim");
    return parser;
  }

  @Override
  public void execute(Namespace args, PrintStream out) throws Exception {
    int trimPercent = args.getInt("percent");
    
    if (trimPercent < 0 || trimPercent > 100) {
      throw new IllegalArgumentException("invalid percent: " + trimPercent);
    }
    
    IndexWriter writer = ctx.getIndexWriter();    
    if (writer != null) {      
      IndexReader reader = ctx.getIndexReader();
      
      writer.deleteDocuments(buildDeleteQuery(trimPercent, reader.maxDoc()));
      writer.commit();      
      ctx.refreshReader();
      reader = ctx.getIndexReader();
      out.println("trim successful, index now contains: " + reader.numDocs() + " docs.");
    }
    else {
      out.println("unable to open writer, index is in readonly mode");
    }
  }

}