package net.mar;

import java.io.*;
import java.sql.*;

import java.util.*;
import java.util.zip.*;
//import net.mar.Format.*;
import java.text.DecimalFormat;

import net.alanmaxwell.sql.SQLDataFormatterSexagecimal;
//import com.ibm.icu.text.DecimalFormat;



public class FormatRS
{
    /**
     * 
     */
    public FormatRS(boolean doSexagesimal,String [] raNames, String [] decNames) {
        this.doSexagesimal=doSexagesimal;
        this.raNames=raNames;
        this.decNames=decNames;
        
        
    }
    /**
     * 
     */
    public FormatRS() {
        
        // TODO Auto-generated constructor stub
    }
    private boolean doSexagesimal=false;;
    String [] raNames=null;
    String [] decNames=null;
    int [] raCols=null;
    int [] decCols=null;
    SQLDataFormatterSexagecimal sexagesimalRA; //=new SQLDataFormatterSexagecimal(true,2);
    SQLDataFormatterSexagecimal sexagesimalDec; //=new SQLDataFormatterSexagecimal(false,2);
    
	private String FileName;
    private int noCols=0;
    boolean vot=false;
    Object[] row;
    static StringBuffer mb;
    StringBuffer sb=new StringBuffer("                              "+
	"                                                               "+
	"                                                               "+
	"                                                               "+
    "                                                               ");
    int recordLength=0;
    int noCharCols=0;
    int[] charCols;
    int[] charLength;
    Format [] formatArray;
    String [] stringArray;
    int [] typesArray;
	String tempString=new String()	;
	//int noRows=0;
	ResultSetMetaData rsmd;
    double dnull=-9999.999;
    static double nan=0.0;//3.4E+38;
    static final double SINGLE_PREC=6;
    static final double DOUBLE_PREC=7;
    static final int SINGLE_WIDTH=14;
    static final int DOUBLE_WIDTH=16;
	static final double LOW=1.0E-4;
	static final double HIGH=10000.0;
    static final double loge=Math.log(10.0);
//    DecimalFormat singleFix  =  new DecimalFormat("+#####0.000000;-");
    DecimalFormat singleFix  =  new DecimalFormat("+#####0.000000;-");
//    DecimalFormat singleExp  =  new DecimalFormat("+0.000000E+000;-");
    DecimalFormat singleExp  =  new DecimalFormat("+0.000000E000;-");
    DecimalFormat doubleFix  =  new DecimalFormat("+#####0.0000000;-");
//    DecimalFormat doubleExp  =  new DecimalFormat("+0.0000000E+000;-");
    DecimalFormat doubleExp  =  new DecimalFormat("+0.0000000E000;-");
    DecimalFormat tiny_int = new DecimalFormat(" ##0;-");
    DecimalFormat small_int = new DecimalFormat(" ####0;-");
    DecimalFormat norm_int = new DecimalFormat(" #########0;-");
//    DecimalFormat big_int = new DecimalFormat(" 0000000000000000000;-");
    DecimalFormat big_int = new DecimalFormat(" ##################0;-");
    
    static String blanks;
    static int maxPadSize=20;
   
    
    static {
        mb=new StringBuffer(maxPadSize);
        for (int i=0; i<maxPadSize; i++) {
            //System.out.println("hh");
            mb.append(" ");            
        }
        blanks=mb.toString();
       
        }    
    
    
	/*public static String padl(String s,int n)
	 {
      char c=' ';
	  int len = s.length();
	  if( len>=n ) return s.substring(0,n);

	  char[] buf = new char[n];
	  for( int i=0;i<n-len;i++ ) buf[i]=c;

	  s.getChars(0,len,buf,n-len);
	  return new String(buf);
	 }
		*/

    public void setVOT(boolean vot){
        this.vot=vot;
    }
	public static String pad( String src , int n, boolean vot)
	    {
	    if (!vot) {
			//String blanks = "                    " ;
		    //int blanksLength=blanks.length();
	        //String result = src ;
	        int size=src.length();
	        
	        if ( n - size > 0 &&  n <= maxPadSize) {
	            return mb.substring( 0 , n - size) + src ;
	        //    return blanks.substring( 0 , n - size) + src ;
	        }
	        else
		        {
			  return src;
			      }
	    }
	    else {
	        return src.trim();
	    }
	    }

	public  Format [] setRSMD(ResultSetMetaData rsmd){
	try {
		this.rsmd=rsmd;
//		System.out.println("oh yess");
	noCols=rsmd.getColumnCount();
    formatArray=new Format[noCols];
    stringArray=new String[noCols];
    typesArray=new int[noCols];
	row = new Object[noCols];
    charCols=new int[noCols];
    charLength=new int[noCols];
		for (int i=0; i<noCols; i += 1) {
			//System.out.println(rsmd.getColumnTypeName(i+1)+"::"+rsmd.getTableName(i+1));
			switch(rsmd.getColumnType(i+1)){
				case Types.TINYINT :
				formatArray[i]=new Format("%4i");
				typesArray[i]=Types.TINYINT;
				break;
				case Types.SMALLINT :
				formatArray[i]=new Format("%+6i");
				typesArray[i]=Types.SMALLINT;
				break;
				case Types.INTEGER :
				formatArray[i]=new Format("%11i");
				typesArray[i]=Types.INTEGER;
				break;
				case Types.BIGINT :
				formatArray[i]=new Format("%0+20i");
				typesArray[i]=Types.BIGINT;
				break;
				case Types.REAL :
				formatArray[i]=new Format("%#14.6g");
				typesArray[i]=Types.REAL;
				break;
				case Types.FLOAT :
				formatArray[i]=new Format("%#16.7g");
				typesArray[i]=Types.FLOAT;
				break;
				case Types.DOUBLE :
				formatArray[i]=new Format("%#16.7g");
				typesArray[i]=Types.DOUBLE;
				break;
				case Types.VARCHAR :
				charLength[i]=rsmd.getPrecision(i+1);
				formatArray[i]=new Format("%"+charLength[i]+"s");
				typesArray[i]=Types.VARCHAR;
				break;
				case Types.CHAR :
				charLength[i]=rsmd.getPrecision(i+1);
				formatArray[i]=new Format("%"+charLength[i]+"s");
				typesArray[i]=Types.CHAR;
				break;
				case Types.DATE :
				charLength[i]=24;
				formatArray[i]=new Format("%24s");
				typesArray[i]=Types.DATE;
				break;
				case Types.DECIMAL :
				formatArray[i]=new Format("%0+16.7g");
				typesArray[i]=Types.DECIMAL;
				break;
				case Types.NUMERIC :
				formatArray[i]=new Format("%0+16.7g");
				typesArray[i]=Types.NUMERIC;
				break;
				default :
				formatArray[i]=new Format("%21s");
				charLength[i]=21;
				typesArray[i]=Types.OTHER;
				break;
			}
			if (doSexagesimal && (raNames != null || decNames != null)){
			    try {
			        sexagesimalRA =new SQLDataFormatterSexagecimal(true,2);
	                 sexagesimalDec =new SQLDataFormatterSexagecimal(false,1);
			    setColsRaDec(rsmd,raNames,decNames);
			    }
			    catch (SQLException se) {
			        
			    }
			}
		}

}

catch(Exception e){
				System.out.println("A Problem occured: " + e);
			}

return formatArray;

}



public String[] setRS(ResultSet rs){
	double value;
	
	
	//stringArray=new String[noCols];
	
	try {
        //noRows=-+1;
		for (int i=0; i<noCols; i += 1) {
			//switch(rsmd.getColumnType(i+1)){
			switch(typesArray[i]){
				case Types.TINYINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(tiny_int.format(Long.parseLong(rs.getString(i+1))),4);
				stringArray[i]=pad(tiny_int.format(rs.getShort(i+1)),4,vot);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]=pad(tiny_int.format(0L),4,vot);
				}
				break;
				case Types.SMALLINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(small_int.format(Long.parseLong(rs.getString(i+1))),6);
				stringArray[i]=pad(tiny_int.format(rs.getShort(i+1)),6,vot);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]=pad(small_int.format(0L),6,vot);
				}
				break;
				case Types.INTEGER :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(norm_int.format(Long.parseLong(rs.getString(i+1))),11);
				    stringArray[i]=pad(tiny_int.format(rs.getInt(i+1)),11,vot);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]=pad(norm_int.format(0L),11,vot);
				}
				break;
				case Types.BIGINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(big_int.format(Long.parseLong(rs.getString(i+1))),20);
				    stringArray[i]=pad(big_int.format(rs.getLong(i+1)),20,vot);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]=pad(big_int.format(0L),20,vot);
				}
				break;
				case Types.REAL :
				try {
				//stringArray[i]=formatArray[i].form(Double.parseDouble(rs.getString(i+1)));
					value=Double.parseDouble(rs.getString(i+1));
				   
					//if (Math.log(Math.abs(value))/loge > -4.0 && Math.abs(value) < 10000.)
					if (Math.abs(value) > LOW && Math.abs(value) < HIGH)
					{
						stringArray[i]=pad(singleFix.format(value),SINGLE_WIDTH,vot);
				
					}
					else
					{
						stringArray[i]=pad(singleExp.format(value),SINGLE_WIDTH,vot);
					}
				}

				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(dnull);
				stringArray[i]=pad(singleExp.format(nan),SINGLE_WIDTH,vot);
				}
				break;
				case Types.FLOAT :
				try {
					//stringArray[i]=formatArray[i].form(Double.parseDouble(rs.getString(i+1)));
					//value=Double.parseDouble(rs.getString(i+1));
				    value=rs.getDouble(i+1);
					//if (Math.log(Math.abs(value))/loge > -4.0 && Math.abs(value) < 10000.)
					if (Math.abs(value) > LOW && Math.abs(value) < HIGH)
					{
						stringArray[i]=pad(doubleFix.format(value),DOUBLE_WIDTH,vot);
					}
					else
					{
						stringArray[i]=pad(doubleExp.format(value),DOUBLE_WIDTH,vot);
					}
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(dnull);
					stringArray[i]=pad(doubleExp.format(nan),DOUBLE_WIDTH,vot);
				}
				break;
				case Types.DOUBLE :
//				    System.out.println("here");
					try {
					    
						//stringArray[i]=formatArray[i].form(Double.parseDouble(rs.getString(i+1)));
						//value=Double.parseDouble(rs.getString(i+1));
						value=rs.getDouble(i+1);
						//if (Math.log(Math.abs(value))/loge > -4.0 && Math.abs(value) < 10000.)
						if (Math.abs(value) > LOW && Math.abs(value) < HIGH)
						{
							stringArray[i]=pad(doubleFix.format(value),DOUBLE_WIDTH,vot);
						}
						else
						{
							stringArray[i]=pad(doubleExp.format(value),DOUBLE_WIDTH,vot);
						}
					}
					catch(Exception e) {
					//stringArray[i]=formatArray[i].form(dnull);
						stringArray[i]=pad(doubleExp.format(nan),DOUBLE_WIDTH,vot);
					}
					break;
				case Types.VARCHAR :
					try {
						tempString=rs.getString(i+1);
						
						if (tempString==null || tempString.equals("null")){
							tempString=" ";
								}
					stringArray[i]=formatArray[i].form(tempString);
						
					}
					catch(Exception e) {
					stringArray[i]=formatArray[i].form(" ");
					}
				    break;
					case Types.CHAR :
					try {
						tempString=rs.getString(i+1);
						
							if (tempString==null || tempString.equals("null")){
								tempString=" ";
									}
					stringArray[i]=formatArray[i].form(tempString);
	

					}
					catch(Exception e) {
					stringArray[i]=formatArray[i].form(" ");
					}
				    break;

					case Types.DATE :
							    tempString=rs.getString(i+1);
							    if (tempString==null || tempString.equals("null")){
									tempString=" ";

								}
							    stringArray[i]=formatArray[i].form(tempString);
							    break;
					case Types.OTHER :
					tempString=rs.getString(i+1);
					if (tempString==null || tempString.equals("null")){
						tempString=" ";
								}
					tempString=(tempString+sb.substring(0,charLength[i])).substring(0,charLength[i]);
					stringArray[i]=formatArray[i].form(tempString);
								break;	
				case Types.DECIMAL :
				try {
				//stringArray[i]=formatArray[i].form(Double.parseDouble(rs.getString(i+1)));
				value=Double.parseDouble(rs.getString(i+1));
					if (Math.abs(value) > LOW && Math.abs(value) < HIGH)
					{
						stringArray[i]=pad(doubleFix.format(value),DOUBLE_WIDTH,vot);
					}
					else
					{
						stringArray[i]=pad(doubleExp.format(value),DOUBLE_WIDTH,vot);
					}
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(nan);
				stringArray[i]=pad(doubleExp.format(nan),DOUBLE_WIDTH,vot);
				}
				break;

				case Types.NUMERIC :
				try {
				//stringArray[i]=formatArray[i].form(Double.parseDouble(rs.getString(i+1)));
				value=Double.parseDouble(rs.getString(i+1));
					if (Math.abs(value) > LOW && Math.abs(value) < HIGH)
					{
						stringArray[i]=pad(doubleFix.format(value),DOUBLE_WIDTH,vot);
					}
					else
					{
						stringArray[i]=pad(doubleExp.format(value),DOUBLE_WIDTH,vot);
					}
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(nan);
				stringArray[i]=pad(doubleExp.format(nan),DOUBLE_WIDTH,vot);
				}
				break;

	

				default :
				tempString=rs.getString(i+1);
				if (tempString==null || tempString.equals("null")){
					tempString=" ";
							}
				tempString=(tempString+sb.substring(0,charLength[i])).substring(0,charLength[i]);
				stringArray[i]=formatArray[i].form(tempString);
							break;
			}
		}

        if (doSexagesimal && (raCols!= null || decCols != null)) {
            if (raCols!=null) {
            for (int i=0; i<raCols.length;i++) {
                stringArray[raCols[i]]=sexagesimalRA.formatDataForHTML(stringArray[raCols[i]]);
            }
            }
            if (decCols!=null) {
            for (int i=0; i<decCols.length;i++) {
                stringArray[decCols[i]]=sexagesimalDec.formatDataForHTML(stringArray[decCols[i]]);
            }
            }
        }
		
}
catch(Exception e){
				System.out.println("A Problem occured setRS: " + e);
			}
return stringArray;

}

void setColsRaDec (ResultSetMetaData rsmd, String [] namesRA, String [] namesDec) throws SQLException {
    int numCols=rsmd.getColumnCount();
    int [] allColsRA = new int [numCols];
    int [] allColsDec = new int [numCols];
    int runTotRA=0;
    int runTotDec=0;
    for (int i=0; i<numCols; i++) {
    for (int j=0; j<namesRA.length; j++) {
        if (rsmd.getColumnName(i+1).equalsIgnoreCase(namesRA[j])) {
            runTotRA++;
            allColsRA[i]=1;
        }
    }
    for (int j=0; j<namesDec.length; j++) {
        if (rsmd.getColumnName(i+1).equalsIgnoreCase(namesDec[j])) {
            runTotDec++;
            allColsDec[i]=1;
        }
    }
    }
    if (runTotRA >0) {
        raCols=new int [runTotRA];
        int pos=0;
        for (int i=0; i< allColsRA.length; i++) {
            if (allColsRA[i]==1) {
                raCols[pos]=i;
                pos++;
            }
        }
    }
    if (runTotDec >0) {
        decCols=new int [runTotDec];
        int pos=0;
        for (int i=0; i< allColsDec.length; i++) {
            if (allColsDec[i]==1) {
                decCols[pos]=i;
                pos++;
            }
        }
    }
    
    
    
 }



}