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

package backup;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.zip.ZipOutputStream;

// =======================================================
// API de alto bajo nivel utilizable amigablemente desde las aplicaciones
// =======================================================
public class ArchivoDeduplicadoAPI extends ArchivoDeduplicado{

    public ArchivoDeduplicadoAPI(String fichero) throws FileNotFoundException, IOException, ParseException, ADException
    {
        super(fichero);
    }

    public ArchivoDeduplicadoAPI(String fichero,long codInicial,int retencion) throws FileNotFoundException, IOException, ParseException
    {
        super(fichero,codInicial,retencion);
    }
 

    public void selectBackup(int code) throws IOException, ADException
    {
        loadBackup(code);
        System.out.println("Seleccionado backup de fecha:"+getStrFechaBackup());
    }

    public void newBackup() throws IOException
    {
        createBackup();
    }

    public void cerrarBackup() throws IOException
    {
        closeBackup();
    }

    public void doJob(Job trabajo) throws FileNotFoundException, IOException, ADException
    {
        directorioActual=directorio;

        createDir(trabajo.getEtiqueta());

        if (!trabajo.getFlagArchivo())
        { 
            addDirectorio(trabajo);
        }
        else
        {
            Archivo arch=new Archivo(trabajo.getFichero());
            arch.setPath(trabajo.getPath());
            File fich=new File(trabajo.getPath()+"\\"+trabajo.getFichero());
            if (!fich.exists()) throw new ADException(ADException.ADE_CDDIR,trabajo.getPath()+"\\"+trabajo.getFichero());
            procesaAddFichero(arch);
        }
    }

    public String[] tokeniza(String cad)
    {
       String token;
       ArrayList<String> tokens=new ArrayList<String>();
       int l;
       int e=0;
       char c;
       int in=0;
       for(l=0;l<cad.length();l++)
       {
           c=cad.charAt(l);
           if (c=='\"' && l>in)
           {
               token=cad.substring(in+1,l);
               if (!token.trim().equals("")) tokens.add(token);
               in=l+1;
           }
           if (c==' ' && cad.charAt(in)!='\"')
           {
               token=cad.substring(in, l);
               if (!token.trim().equals("")) tokens.add(token);
               in=l+1;
           }
       }
       if (in<(l-1))tokens.add(cad.substring(in, l));
       return tokens.toArray(new String[0]);
    }


    public void doJobs(String fichero) throws FileNotFoundException, IOException, ADException
    {
        FileReader fr = null;
        BufferedReader br = null;
      
        fr = new FileReader (fichero);
        br = new BufferedReader(fr);

        String linea;
        while((linea=br.readLine())!=null)
        {
            String tokens[]=tokeniza(linea);
            Job trabajo=new Job();
            trabajo.setEtiqueta(tokens[0]);
            trabajo.setRutaCompleta(tokens[1]);
            if (tokens.length>2 && tokens[2].equals("-R")) trabajo.setRecursivo(false); else trabajo.setRecursivo(true);
            trabajo.print();
            System.out.println("------------------");
            doJob(trabajo);
        }
        br.close();
        if( null != fr ) fr.close();
     }
    

    public void extraer(Job trabajo,String destino) throws FileNotFoundException, IOException, ADException
    {
        directorioActual=directorio;
        cdDir(trabajo.getPath());

        if (!trabajo.getFlagArchivo())
        {
            extraerDirectorio(trabajo,destino);
        }
        else
        {
            Archivo arch=loadArchivo(trabajo.getFichero());
            extraerFichero(arch,destino);
        }
    }

    public void extraerToZIP(Job trabajo,String destino) throws FileNotFoundException, IOException, ADException
    {

        if (trabajo.getFlagArchivo()) throw new ADException(ADException.ADE_SINTAX,trabajo.getFichero());

        directorioActual=directorio;
        cdDir(trabajo.getPath());
        
        ZipOutputStream fichOut = new ZipOutputStream(new FileOutputStream(destino));
        extraerDirectorioToZIP(trabajo,"",fichOut);
        fichOut.close();
    }

    public void list(Job trabajo) throws ADException
    {
        directorioActual=directorio;
        cdDir(trabajo.getPath());
        printDirActual(trabajo);
    }

    public void list() throws ADException
    {
        directorioActual=directorio;
        printDirActual();
    }
}
