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

package fvcservice;

import backup.ArchivoDeduplicadoAPI;
import backup.Job;
import java.io.File;
import java.util.List;
import paqueteBL.FvcBL;
import paqueteBL.Host;
import paqueteBL.HostExt;
import paqueteBL.Pool;
import paqueteBL.VM;
import paqueteBL.VMext;
import paqueteDAO.HostDAO;
import paqueteDAO.PoolDAO;
import paqueteDAO.VmDAO;
import paqueteMail.utilsMail;
import paqueteVIX.VIX;

/**
 *
 * @author sysmq
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {

        HostDAO hd=new HostDAO();
        VmDAO vd=new VmDAO();
        PoolDAO pd=new PoolDAO();
        Pool pool=pd.read();
        String dataStore=pool.getDataStore();
        String pathBackup=pool.getPathBackup();

        ArchivoDeduplicadoAPI ad=new ArchivoDeduplicadoAPI(pathBackup+"\\backup.ad");
        ad.createBackup();

        List<HostExt> hosts=hd.findByQuery("select * from host where estado<>"+Host.ESTADO_MANTENIMIENTO);
        int i;
        FvcBL fvc=new FvcBL();
        for(i=0;i<hosts.size();i++)
        {
            System.out.println("Conectando con Host "+hosts.get(i).getNombre());
            List<VMext> vms=fvc.findVMbyHost(hosts.get(i));
            if (vms==null)
            {
                System.out.println("ERRROR: Host "+hosts.get(i).getNombre()+" no disponible!");
                //enviar email y almacenar error en BBDD!
                utilsMail.enviarEmail(pool.getResponsable(),"ERRROR: Host "+hosts.get(i).getNombre()+" no disponible!","ERRROR: Host "+hosts.get(i).getNombre()+" no disponible!");
            }
            else
            {
                int v;
                for(v=0;v<vms.size();v++)
                {
                    VMext vm=vd.findByNombre(vms.get(v).getNombre());
                    if (vm==null) 
                    {
                        System.out.println("Encontrada nueva VM: "+vms.get(v).getNombre());
                        vd.insert(vms.get(v));
                    }
                    else
                        if (vm.getEstado()!=vms.get(v).getEstado())
                        {
                            System.out.println("Cambiando estado de disponibilidad de: "+vms.get(v).getNombre());
                        }
                    if (vms.get(v).getEstado()==VM.ESTADO_START)
                    {
                    String ruta=vms.get(v).getPath();
                    File directorio=new File(dataStore+ruta);
                    if (directorio.exists())
                    {
                        System.out.println("Respaldando VM:"+vms.get(v).getNombre());
                        Job trabajo=new Job();
                        trabajo.setEtiqueta(vms.get(v).getNombre());
                        trabajo.setRutaCompleta(dataStore+ruta+"\\"+vms.get(v).getNombre()+".vmx");
                        ad.doJob(trabajo);
                        File[] ficheros=directorio.listFiles();
                        VIX.snapshot(vms.get(v));
                        int f;
                        for(f=0;f<ficheros.length;f++)
                        {
                            if (ficheros[f].getName().endsWith(".vmdk")) 
                            {
                                trabajo.setRutaCompleta(ficheros[f].getAbsolutePath());
                                ad.doJob(trabajo);
                            }
                        }
                        VIX.delete_snapshot(vms.get(v));
                    }
                    }
                }
            }

            ad.cerrarBackup();
        }

}
}