package com.fitbank.formmanager;

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.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JOptionPane;
import org.apache.commons.io.IOUtils;

/**
 * Clase que permite subir formularios a una base de datos independiente
 * del servidor de aplicaciones.
 * 
 * @author SoftwareHouse S.A.
 */
public class FormUploader {

    private int company = 2;

    private final UploadFiles uf = new UploadFiles();

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

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

    /**
     * Lista de los unicos formularios que se deben subir si son encontrados
     * en la ruta de formularios.
     * Si esta vacia la lista, se suben todos los formularios encontrado en el directorio.
     */
    private static final List<String> TRANS_LIST = new ArrayList<String>();

    public int getCompany() {
        return company;
    }

    public void setCompany(int company) {
        this.company = company;
    }

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

            for (File file : files) {
                try {
                    if (file.isDirectory()) {
                        this.process(file.listFiles(), false);
                    } else {
                        String name = file.getName();
                        String transaction = name.substring(0, name.indexOf('.'));

                        if (TRANS_LIST.isEmpty() || TRANS_LIST.contains(transaction)) {
                            String tipo = name.substring(name.lastIndexOf('.') + 1);

                            if ("wpx".equals(tipo) || "xml".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");
                }
            }

            Helper.beginTransaction();
            uf.setRetries(4);
            uf.retryRejectedFiles();
            Helper.commitTransaction();
        } catch (Exception e) {
            Debug.error("Error al procesar formularios", e);
        } finally {
            Helper.closeSession();
        }
        this.printSummary();
    }

    private void printSummary() {
        System.out.println("########################################");
        System.out.println("Formularios subidos: " + siSubidos.size());
        System.out.println("Formularios no subidos: " + noSubidos.size());
        System.out.println("########################################");
        System.out.println("SUBIDOS\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(FormUploader.class,
                "xml", "wpx");

        Integer company = (Integer) JOptionPane.showInputDialog(null, "Compania",
                "Ingrese el codigo de compania",
                JOptionPane.QUESTION_MESSAGE, null, new Integer[]{2, 3,
                    4, 5, 6, 7, 8, 9, 10}, 0);
        FormUploader fu = new FormUploader();
        fu.setCompany(company);
        fu.process(files.toArray(new File[0x0]), true);
    }
}
