/*
 * Created on 30-Apr-2008
 *
 * TODO 
 */
package uk.ac.roe.wfau.results;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import net.mar.ACSVWriter;
import net.mar.FormatRS;

import uk.ac.roe.wfau.QueryRetrieverThread;

/**
 * @author mar
 *
 */
public class ResultsCSVWriter extends ResultsFileWriter {
    
    FormatRS frs ; 
   
    PrintWriter CSVWriter = null;
    OutputStream CSVOutputStream = null;
    int noCols;
    String [] strArray;
    boolean doRADec=false;
    String [] raNames=null;
    String [] decNames=null;
    String [] comments=null;
    /**
     * @param filename
     * @param compressionType
     * @param query
     */
    
    public void addComments(String []  comm) {
        //fw.setComments(comm);
        this.comments=comm;
        //System.out.println("here5");
    }
    
    public ResultsCSVWriter(String baseDir, String subDir, String fileStem, int compressionType, String query,String database,ResultSetMetaData rsmd) {
        super(baseDir,subDir, fileStem, compressionType, query,database,rsmd);
        
        // TODO Auto-generated constructor stub
    }

    
    public void setColsRADec (boolean doRADec,String [] raNames, String [] decNames){
        this.doRADec=doRADec;
        this.raNames=raNames;
        this.decNames=decNames;
    }
    public String init() throws SQLException,Exception {

      
       frs = new FormatRS(doRADec,raNames,decNames); 
       switch (compressionType) {
       case QueryRetrieverThread.COMPRESS_NONE:
           savedFilename = fileStem + ".csv";
           fileDescr="CSV ASCII";
           try {

               CSVOutputStream = new BufferedOutputStream(new FileOutputStream(baseDir+
                       subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE);
           } catch (Exception e) {
               e.printStackTrace();
               CSVOutputStream = null;
           }
           break; // case COMPRESS_NONE
       case QueryRetrieverThread.COMPRESS_ZIP:
           savedFilename = fileStem+ ".zip";
           fileDescr="zipped CSV ASCII";
           try {
               CSVOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(
                       baseDir + subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE));

               // Prepare the zip
               ((ZipOutputStream) CSVOutputStream).setLevel(9);
               ((ZipOutputStream) CSVOutputStream).putNextEntry(new ZipEntry(fileStem + ".csv"));
           } catch (Exception e) {
               CSVOutputStream = null;
               e.printStackTrace();
           }
           break; // case COMPRESS_ZIP
       case QueryRetrieverThread.COMPRESS_GZIP:
           savedFilename = fileStem + ".csv.gz";
           fileDescr="gzipped CSV ASCII";
           try {
               CSVOutputStream = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(
                       baseDir + subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE));
           } catch (Exception e) {
               CSVOutputStream = null;
               e.printStackTrace();
           }
           break; // case COMPRESS_GZIP
       } // switch

       if (CSVOutputStream != null) {
           try {
               CSVWriter = new PrintWriter(CSVOutputStream, true);
           } catch (Exception e) {
               CSVWriter = null;
               e.printStackTrace();
           }
           ;
       }
       noCols=rsmd.getColumnCount();
       
       strArray = new String[noCols]; 
       frs.setRSMD(rsmd);
       CSVWriter.print(ACSVWriter.printHeader(rsmd,query,database,comments));
       return savedFilename;
    }
    public void writeRow(ResultSet rs){
        strArray=frs.setRS(rs);   
       
        for (int column = 1; column <= noCols; column++) {
        if (CSVWriter != null) {
            
            //columnData = strArray[column-1];
            if (column == noCols) {
                CSVWriter.println(
                //columnFormats[column -
                // 1].formatDataForCSV(columnData)
                        strArray[column - 1]);
            } else {
                CSVWriter.print(
                //columnFormats[column -
                // 1].formatDataForCSV(columnData) + ","
                        strArray[column - 1] + ",");
            }
            ;
        }
        ; // if (GenerateCSV == true)
    }
    }
    
    public void finishUp() throws IOException {
        if (CSVWriter != null) {
            CSVWriter.flush(); // Ensure all data is finished

            if (compressionType == QueryRetrieverThread.COMPRESS_ZIP) {
                ((ZipOutputStream) CSVOutputStream).closeEntry();
            }
            ;

            CSVWriter.close();
        }
        CSVWriter = null;
        CSVOutputStream = null;   
    }
    public String [] getStrArray() {
        return strArray;
    }
    
}
