/*
 * Created on 30-Apr-2008
 *
 * TODO 
 */
package uk.ac.roe.wfau.results;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
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.FITSWriter;
import net.mar.FormatRS;

import uk.ac.roe.wfau.QueryRetrieverThread;

/**
 * @author mar
 *
 */
public class ResultsFITSWriter extends ResultsFileWriter {
    FITSWriter fw=null;
    
    FormatRS frs = new FormatRS(); 
    String [] comments=null;
    PrintWriter CSVWriter = null;
    OutputStream CSVOutputStream = null;
    int noCols;
    String [] strArray;
    
    /**
     * @param filename
     * @param compressionType
     * @param query
     */
    public ResultsFITSWriter(String baseDir, String subDir, String fileStem, int compressionType, String query,String database,ResultSetMetaData rsmd) {
        
        super(baseDir,subDir, fileStem, compressionType, query,database,rsmd);
        //System.out.println("here1");
        
        // TODO Auto-generated constructor stub
    }

  
    public String init() throws SQLException,Exception {
        //System.out.println("here2a");
        try {
        fw = new FITSWriter(query,database,archiveID);
        }
        catch (Exception e) {
            System.out.println(e);
        }
        //System.out.println("here3");
        if (comments!=null) {
            fw.setComments(comments);
        }
        if (compressionType == QueryRetrieverThread.COMPRESS_GZIP) {
            savedFilename=fileStem + ".fits.gz";
        }
        else {
        savedFilename = fileStem + ".fits";
        }
        File FITSFile = new File(baseDir + subDir + savedFilename);
        if (FITSFile.exists()) {
            FITSFile.delete();
        }

        fw.setFileName(baseDir + subDir + fileStem + ".fits");
       
        fw.setRSMD(rsmd);
        //System.out.println("here4");
       return savedFilename;
    }
    
    public void addComments(String []  comm) {
        //fw.setComments(comm);
        this.comments=comm;
        //System.out.println("here5");
    }
    public void writeRow(ResultSet rs){
        fw.setRS(rs);
    }
    
    public void finishUp() throws IOException {
        fw.close();
        if (compressionType == QueryRetrieverThread.COMPRESS_GZIP) {

            try {
                // Create the GZIP output stream
                String outFilename = baseDir + subDir + fileStem + ".fits.gz";
                GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(outFilename));

                // Open the input file
                String inFilename = baseDir + subDir + fileStem + ".fits";
                FileInputStream in = new FileInputStream(inFilename);

                // Transfer bytes from the input file to the GZIP
                // output stream
                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
                in.close();

                // Complete the GZIP file
                out.finish();
                out.close();
//                savedFilename = FITSName + ".fits.gz";
                fileDescr="gzipped FITS";
            } catch (IOException e) {
            }
        }
        else {
            fileDescr="FITS";
        }
    }
    public String [] getStrArray() {
        return strArray;
    }
    
}
