/*
 * MainControlWrapper.java
 *
 * Created on 13 novembre 2007, 14:52
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package fr.gouv.finances.cp.xemelios.controls.extend;

import fr.gouv.finances.dgfip.utils.Pair;
import fr.gouv.finances.dgfip.xemelios.common.config.DocumentModel;
import fr.gouv.finances.dgfip.xemelios.common.config.DocumentsModel;
import fr.gouv.finances.cp.xemelios.controls.DlgControl;
import fr.gouv.finances.cp.xemelios.controls.MainControl;
import fr.gouv.finances.cp.xemelios.controls.MainControl.Triplet;
import fr.gouv.finances.cp.xemelios.controls.models.DocumentControlModel;
import fr.gouv.finances.dgfip.xemelios.importers.EtatImporteur;
import fr.gouv.finances.cp.xemelios.ui.MainWindow;
import fr.gouv.finances.cp.xemelios.ui.MainWindow.ImportContent;
import fr.gouv.finances.dgfip.xemelios.auth.XemeliosUser;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Hashtable;
import javax.swing.JOptionPane;

/**
 *
 * @author chm
 */
public class MainControlWrapper implements Runnable {
    private DlgControl dlgControl = null;
    private MainControl mc = null;
    private DocumentModel dmRapport = null;
    private XemeliosUser user;
    
    /** Creates a new instance of MainControlWrapper */
    public MainControlWrapper(DocumentModel dm,DocumentsModel docsMod,XemeliosUser user) {
        super();
        this.user=user;
        this.mc=new MainControl(dm,docsMod);
        dmRapport = docsMod.getDocumentById(MainControl.ID_DOCUMENT_RAPPORT);
    }
    
    private void importer(DocumentModel dm,Pair coll,Pair budg,File f,boolean isRapport,MainControl.Triplet triplet) {
        try {
            Class clazz = Class.forName(dm.getImportClass());
            Constructor cc = clazz.getConstructor(XemeliosUser.class);
            Object obj = cc.newInstance(user);
            if(!(obj instanceof EtatImporteur)) {
                JOptionPane.showMessageDialog(MainWindow.instance,"Cette classe n'est pas un importeur.\nLe fichier de configuration qui vous a été livré est certainement invalide.\nVeuillez contacter votre fournisseur.\n","Erreur",JOptionPane.ERROR_MESSAGE);
                return;
            }
            EtatImporteur ei = (EtatImporteur)obj;
            ei.setDocument(dm,coll,budg);
            ArrayList<File> array = new ArrayList<File>();
            array.add(f);
            ImportContent fToImport = new ImportContent();
            fToImport.setFilesToImport(array);
            
            if(isRapport) {
                MainWindow.instance.doImport(ei,fToImport,dm,dlgControl,triplet,true);
            } else {
                MainWindow.instance.doImport(ei,fToImport,dm,true);
            }
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            
        }
    }
    public void setDlgControl(DlgControl dlgControl) {
        this.dlgControl=dlgControl;
        mc.setControlProgressListener(dlgControl);
    }
    public void writeControlConfigFile() throws IOException {
        mc.writeControlConfigFile();
    }
    public DocumentControlModel getDocumentControl() { return mc.getDocumentControl(); }
    public void setFileToControl(File fToCtrl) { mc.setFileToControl(fToCtrl); }
    public void setParameters(Hashtable<String,Object> params) { mc.setParameters(params); }
    public void run() {
        mc.run();
        switch (mc.getControlStatus()) {
            case MainControl.STATUS_CONTROL_NO_ERROR: {
                int reponse = JOptionPane.showConfirmDialog(MainWindow.instance,
                        "Le fichier "+mc.getFileToControl().getName()+" ne comporte pas d'anomalies.\nSouhaitez-vous quand même l'importer?",
                        "Question",
                        JOptionPane.YES_NO_OPTION);
                // Confirmation de l'import du flux malgré l'absence d'anos
                if(JOptionPane.YES_OPTION == reponse){
                    // Import du doc
                    importer(mc.getDocumentModel(),mc.getCollectivite(),mc.getBudget(),mc.getFichierEnrichi(),false,null);
                    // 	Import du rapport si des anos sont présentes
                    importer(dmRapport,mc.getCollectivite(),mc.getBudget(),mc.getRapport(),true,new Triplet(mc.getIdRapport(),mc.getCollectivite().key,mc.getBudget().key));
                } else {
                    dlgControl.notifyImportFinished(null);
                }
                break;
            }
            case MainControl.STATUS_NOT_VALID: {
                importer(mc.getDocumentModel(),mc.getCollectivite(),mc.getBudget(),mc.getFichierEnrichi(),false,null);
                importer(dmRapport,mc.getCollectivite(),mc.getBudget(),mc.getRapport(),true,new Triplet(mc.getIdRapport(),mc.getCollectivite().key,mc.getBudget().key));
                break;
            }
            case MainControl.STATUS_NOT_SCHEMA_VALID:
            case MainControl.STATUS_INVALID_ENCODING:
            case MainControl.STATUS_NOT_XML: {
                importer(dmRapport,new Pair("00000000000000","Collectivite de Contrôle"),new Pair("00","Budget de Contrôle"),mc.getRapport(),true,new Triplet(mc.getIdRapport(),"00000000000000","00"));
                break;
            }
        }
    }
}
