/* ======================================================
                  Ricardo Martin Manso
                     PFC - UOC 2010
======================================================= */

package backup;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipOutputStream;


public class Main {


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException, IOException, ADException, ParseException {


       try
       {
       // =======================================================
       // Decodifica los parametros de entrada
       // =======================================================
       if (args.length<1) throw new ADException(ADException.ADE_SINTAX,"");
       
       ArchivoDeduplicadoAPI ada;
       Job trabajo=new Job();
       int codigo;
       int posParam=0;
       String comando;
       String strCod;
       String ruta1="";
       String ruta2="";
       boolean flagRecursivo=true;
       long t1=new Date().getTime();
       List<String> argumentos=new ArrayList<String>();

       

       int i;
       int c;
       String s;

       for(i=0;i<args.length;i++)
       {
           c=args[i].indexOf('"');
           if (c>=0)
           {
               s=args[i].substring(c+1).trim();
               argumentos.add(args[i].substring(0,c).trim()+"\\");
               if (s.length()>0) argumentos.add(s);
           }
           else
               argumentos.add(args[i].trim());
       }

       //for(i=0;i<argumentos.size();i++)  System.out.println(i+" "+argumentos.get(i));

       if (argumentos.size()>1) strCod=argumentos.get(1); else strCod="";

       if (strCod.matches("[0-9]+"))
       {
           codigo=Integer.valueOf(argumentos.get(1));
           posParam=1;
       }
       else
           codigo=0;

       if (argumentos.size()>1+posParam) comando=argumentos.get(posParam+1); else comando="";
       if (comando.equals("")) comando="VIEWBACKUPS";

       if (argumentos.size()>4+posParam)
       {
            if (argumentos.get(posParam+4).equals("-R"))
            {
                ruta1=argumentos.get(posParam+2);
                ruta2=argumentos.get(posParam+3);
            }
            else if (argumentos.get(posParam+3).equalsIgnoreCase("-R"))
            {
                ruta1=argumentos.get(posParam+2);
                ruta2=argumentos.get(posParam+4);
            }
            else
                throw new ADException(ADException.ADE_SINTAX,"");
            
            flagRecursivo=false;
       }
       else if (argumentos.size()>3+posParam)
       {
           ruta1=argumentos.get(posParam+2);
           if (argumentos.get(posParam+3).equalsIgnoreCase("-R")) flagRecursivo=false; else ruta2=argumentos.get(posParam+3);
       }
       else if (argumentos.size()>2+posParam)
       {
           ruta1=argumentos.get(posParam+2);
       }

       
       trabajo.setRecursivo(flagRecursivo);
       // =======================================================
       // Realiza llamdas al API de AD para ejecutar los comandos
       // =======================================================

       if (comando.equalsIgnoreCase("CREATE"))
       {
           // =======================================================
           // Ejecuta comando CREATE
           // =======================================================

           if (ruta1.equals("")) ruta1="15";
           int retencion=Integer.valueOf(ruta1);
           ada=new ArchivoDeduplicadoAPI(argumentos.get(0),0,retencion);
           ada.close(true);
       }
       else if (comando.equalsIgnoreCase("LIST"))
       {
           // =======================================================
           // Ejecuta comando LIST
           // =======================================================

           ada=new ArchivoDeduplicadoAPI(argumentos.get(0));
           System.out.println("Comando: "+comando);
           ada.selectBackup(codigo);
           if (!ruta1.equals(""))
           {
                trabajo.setRutaCompleta(ruta1);
                trabajo.print();
                ada.list(trabajo);
           }
           else
               ada.list();
           ada.close(false);
       }
       else if (comando.equalsIgnoreCase("ADD"))
       {
           // =======================================================
           // Ejecuta comando ADD
           // =======================================================

           if (!ruta1.equals(""))
           {
                ada=new ArchivoDeduplicadoAPI(argumentos.get(0));
                System.out.println("Comando: "+comando);

                if (ada.isCaducado()) ada.doArchivado(false);

                if (ruta2.equals("")) {ruta2=ruta1;ruta1="\\";}
                trabajo.setEtiqueta(ruta1);
                trabajo.setRutaCompleta(ruta2);
                if (trabajo.getFlagArchivo()) trabajo.setRecursivo(false);
                
           
                ada.newBackup();
                if (ruta2.endsWith(".jobs"))
                {
                    System.out.println("ADD jobs:"+ruta2);
                    ada.doJobs(ruta2);
                }
                else
                {
                    trabajo.print();
                    ada.doJob(trabajo);
                }
                ada.cerrarBackup();
           }
           else
               throw new ADException(ADException.ADE_SINTAX,"");
       }
       else if (comando.equalsIgnoreCase("EXTRAER"))
       {
               // =======================================================
               // Ejecuta comando EXTRAER
               // =======================================================

                ada=new ArchivoDeduplicadoAPI(argumentos.get(0));
                System.out.println("Comando: "+comando);
                ada.selectBackup(codigo);
                trabajo.setRutaCompleta(ruta1);
                trabajo.print();
                if (ruta2.endsWith(".zip"))
                {
                    ada.extraerToZIP(trabajo, ruta2);
                }
                else
                    ada.extraer(trabajo,ruta2);
                ada.close(false);
       }
       else if (comando.equalsIgnoreCase("VIEWBACKUPS"))
       {
                // =======================================================
                // Ejecuta comando VIEWBACKUPS
                // =======================================================

                System.out.println("Comando: "+comando);
                ada=new ArchivoDeduplicadoAPI(argumentos.get(0));
                ada.close(false);
       }
       else
           throw new ADException(ADException.ADE_SINTAX,"");

        long t2;
        
        t2=new Date().getTime();

        System.out.println("Tiempo de proceso: "+(t2-t1)/1000+" segundos");
   
       } catch(Exception e)
       {
            System.out.println("ERROR: "+e.getMessage());
           return;
       }

       }


}
