/*
 * This file is part of the Poliqarp suite.
 * 
 * Copyright (C) 2004-2009 by Instytut Podstaw Informatyki Polskiej
 * Akademii Nauk (IPI PAN; Institute of Computer Science, Polish
 * Academy of Sciences; cf. www.ipipan.waw.pl).  All rights reserved.
 * 
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation and appearing in the file gpl.txt included in the packaging
 * of this file.  (See http://www.gnu.org/licenses/translations.html for
 * unofficial translations.)
 * 
 * A commercial license is available from IPI PAN (contact
 * Michal.Ciesiolka@ipipan.waw.pl or ipi@ipipan.waw.pl for more
 * information).  Licensees holding a valid commercial license from IPI
 * PAN may use this file in accordance with that license.
 * 
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */

package ipipan.poliqarp.gui;

import java.io.*;
import java.util.Iterator;
import javax.swing.*;

import ipipan.poliqarp.logic.Match;
import ipipan.poliqarp.logic.Query;
import ipipan.poliqarp.logic.Segment;
import ipipan.poliqarp.logic.results.ColumnType;
import ipipan.poliqarp.stat.MatchCounter;

/**
 * Superclass for result writers.  Subclasses should implement at
 * least methods writeHeader and writeMatch.  Methods writeFooter
 * and writeMatches may be redefined.
 */
public abstract class ResultWriter
{
   protected PrintWriter writer;
   protected Configuration cfg;
   protected int numCols;
   protected String[] colHeaders;

   public ResultWriter() 
   {
      this.cfg = null;
   }

   public ResultWriter(Configuration cfg)
   {
      this.cfg = cfg;
   }

   abstract protected void writeHeader(Query query, String encoding);

   abstract protected void writeMatch(Match match);
   
   protected void writeMatches(Query query)
   {
      for (Iterator<Match> iter = query.getMatchList().getIterator(); 
         iter.hasNext(); ) 
      {
         writeMatch(iter.next());
      }
   }

   protected void writeFooter()
   {
   }

   /**
    * Writes the query results contained in a given match list 
    * to a file, calling writeHeader, writeMatches and writeFooter.
    */
   public void writeResults(String fileName, Query query, String encoding,
      JDialog dialog) throws IOException 
   {
      String[][] results;
      MatchCounter counter = query.getMatchList().getCounter();
      if(counter == null) { // whether the query is statistical
         ColumnType[] ct = query.getHeader();
         colHeaders = new String[ct.length];
         for(int i = 0; i < ct.length; i ++) 
            // FIXME - ColumnType should allow query/result dependent 
            // column names, not only language dependent
            colHeaders[i] = cfg.getComponentName("TEXT_"+ct[i].getName());
      } else {
         // FIXME - maybe MatchCounter should also provide getHeader() method
         colHeaders = counter.getColumnNames();
      }
      numCols = colHeaders.length;

      query.setDirectUnsafeMode(true);
      writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new 
                  FileOutputStream(fileName), encoding)));
      writeHeader(query, encoding);
      writeMatches(query);
      writeFooter();
      writer.close();
      query.setDirectUnsafeMode(false);
      /*
      final JDialog fdlg = dialog;
      SwingUtilities.invokeLater(new Runnable() {
      public void run() {
      fdlg.setVisible(false);
      }
      });
      */
   }
}
