package com.fitbank.classmanager;

import com.fitbank.common.Helper;
import com.fitbank.contentsmanager.ManagerUtils;
import com.fitbank.dto.management.Detail;
import com.fitbank.security.util.UploadFiles;
import com.fitbank.util.Debug;
import com.fitbank.util.ListaArchivos;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.io.IOUtils;

/**
 * Clase que permie subir objetos (.class) a la base de datos para 
 * proceso en caliente.
 * 
 * @author SoftwareHouse S.A.
 */
public class ClassUploader extends ClassLoader {

    private final UploadFiles uf = new UploadFiles();

    private static final List<String> siSubidos = new LinkedList<String>();

    private static final List<String> noSubidos = new LinkedList<String>();

    public void process(File[] files, boolean first) {
        try {
            if (first) {
                ManagerUtils.openSession();
                Detail pDetail = new Detail();
                pDetail.setCompany(2);
                uf.initParameters(pDetail);
            }

            for (File file : files) {
                try {
                    if (file.isDirectory()) {
                        this.process(file.listFiles(), false);
                    } else {
                        String name = file.getName();
                        String tipo = name.substring(name.lastIndexOf('.') + 1);

                        if ("class".equals(tipo)) {
                            Helper.beginTransaction();
                            System.out.println("Procesando " + name + "...");
                            byte[] bytes = IOUtils.toByteArray(new FileInputStream(file));
                            uf.executeUpload(bytes, tipo);
                            Helper.commitTransaction();
                            siSubidos.add(name);
                            System.out.println("Subido exitosamente!\n");
                        }
                    }
                } catch (Exception e) {
                    Helper.rollbackTransaction();
                    noSubidos.add(file.getName());
                    System.out.println("Errores al subir...:");
                    Debug.error(e.getMessage() + "\n");
                }
            }
        } catch (Exception e) {
            Debug.error("Error al procesar formularios", e);
        } finally {
            Helper.closeSession();
        }
        this.printSummary();
    }

    private void printSummary() {
        System.out.println("########################################");
        System.out.println("Clases subidas: " + siSubidos.size());
        System.out.println("Clases no subidas: " + noSubidos.size());
        System.out.println("########################################");
        System.out.println("SUBIDOS\t\t\t\t\tNO SUBIDOS");
        for (int i = 0; i < Math.max(siSubidos.size(), noSubidos.size()); i++) {
            System.out.println((siSubidos.size() > i ? siSubidos.get(i) : "")
                    + "\t\t\t" + (noSubidos.size() > i ? noSubidos.get(i) : ""));
        }
    }

    public static void main(String args[]) throws Exception {
        Collection<File> files = ListaArchivos.getLista(ClassUploader.class,
                "class");

        ClassUploader cu = new ClassUploader();
        cu.process(files.toArray(new File[0x0]), true);
    }
}
