/*
 * Created on 10-Aug-2011
 *
 * /star/java/bin/java -Djava.net.preferIPv4Stack=true -classpath .:WFAUweb/trunk/JavaClassLib/MISC/jtds-1.1.jar:json-jena-1.0.jar:wfau.jar uk.ac.roe.wfau.WebStatsFromFile
 * 
 * TODO 
 */
package uk.ac.roe.wfau;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.TreeMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


/**
 * @author mar
 *
 */
public class WebStatsFromFile {

    public static void main(String[] args) {
        GregorianCalendar gcal = new GregorianCalendar();    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");     
        Date start=null;
        Date end=null;
        String archive=args[0];
        DecimalFormat myFormat=new DecimalFormat("00");
        try {
            start = sdf.parse("2009.01.01");
            end = sdf.parse("2013.07.31");     
            gcal.setTime(start);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int yy,mm,dd;
        TreeMap daysLogged=new TreeMap();
        TreeMap sizeLogged=new TreeMap();
        TreeMap noLogged=new TreeMap();
        
        while (gcal.getTime().before(end)) {         
            gcal.add(Calendar.DAY_OF_YEAR, 1);
            yy=gcal.get(Calendar.YEAR);
            mm=gcal.get(Calendar.MONTH)+1;
            dd=gcal.get(Calendar.DATE);
            //System.out.println( yy+" "+myFormat.format(mm));
            String filename="/data/wsa/tmp/logs/cgi"+yy+"_"+myFormat.format(mm)+"_"+myFormat.format(dd)+".log";
            System.out.println(filename); 
            String key=yy+"-"+myFormat.format(mm);
            File f = new File(filename);
            if (f.exists()) {
                long daysTotal=0;
                long noTotal=0;
                System.out.println("exists");
                if (daysLogged.containsKey(key)) {                    
                    daysLogged.put(key,new Integer(1+((Integer)daysLogged.get(key)).intValue()));
                }
                else {
                    daysLogged.put(key,new Integer(1));
                }
                FileInputStream in=null;
                try {
                    in=new FileInputStream(f);
                    BufferedReader br=new BufferedReader(new InputStreamReader(in));
                    String strLine;
                    while ((strLine=br.readLine()) != null) {
                        
                        if (strLine.indexOf(archive) >=0 &&( strLine.indexOf("getFImage.cgi") >=0 || strLine.indexOf(",MultiGetImage.cgi") >= 0 
                                || strLine.indexOf("fits_download.cgi") >= 0 || strLine.indexOf("fits_download_uncompress") >=0 )) {
                           // System.out.println(strLine);
                            String [] strArray=strLine.split(",");
                            if (strArray.length>=4) {
                                try {
                                daysTotal=daysTotal+Long.parseLong(strArray[3]);
                                noTotal++;
                                }
                                catch (NumberFormatException nfe) {
                                    
                                }
                                
                            }
                        }
                    }
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                finally {
                    try {
                        in.close();
                    } catch (IOException e2) {
                        // TODO Auto-generated catch block
                        e2.printStackTrace();
                    }
                }
                System.out.println("daystot "+daysTotal);
                if (sizeLogged.containsKey(key)) {                    
                    sizeLogged.put(key,new Long(daysTotal+((Long)sizeLogged.get(key)).longValue()));
                }
                else {
                    sizeLogged.put(key,new Long(daysTotal));
                }
                if (noLogged.containsKey(key)) {                    
                    noLogged.put(key,new Long(noTotal+((Long)noLogged.get(key)).longValue()));
                }
                else {
                    noLogged.put(key,new Long(noTotal));
                }
                
            }
            
        }
        Iterator iterator = daysLogged.keySet().iterator(); 
        while (iterator.hasNext()) {
           
            String key = iterator.next().toString();   
            String value = daysLogged.get(key).toString();   
            String noValue=noLogged.get(key).toString();
            System.out.println(key + " :: " + value);  
            System.out.println("numbers "+key + " :: " + noValue);  
        }
        iterator = sizeLogged.keySet().iterator();
        JSONArray json = new JSONArray();
        while (iterator.hasNext()) {
            JSONObject obj = new JSONObject();
            String key = iterator.next().toString();   
            String value = sizeLogged.get(key).toString();   
            try {
                obj.put("x", key+"-15");
                obj.put("y", Math.floor((0.5+((Long)sizeLogged.get(key)).longValue())/(1024*1024*1000)));
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            json.put(obj);
            System.out.println(key + " :: " + value);   
        }
        System.out.println(json.toString());
    }
}
