/*
 * DlgEditRefCompta.java
 *
 * Created on 28 janvier 2008, 14:56
 */


package fr.gouv.finances.cp.xemelios.plugin.generatorPesPjs;

import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

import org.jdesktop.swingx.action.AbstractActionExt;

import fr.gouv.finances.cp.utils.Pair;

/**
 *
 * @author  jp.tessier
 */
public class DlgEditRefCompta extends javax.swing.JDialog {
    
    private boolean isEdit = false;
    private boolean bRet;
    private RefCompta referenceComptable;
    private Action escapeAction,enterAction;
    
    /** Creates new form DlgEditRefCompta */
    public DlgEditRefCompta(JFrame parent, boolean modal) {
        super(parent, modal);
        
        initComponents();
        setLocationRelativeTo(parent);        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        domaines = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        exercice = new javax.swing.JTextField();
        label_type_piece = new javax.swing.JLabel();
        type_piece = new javax.swing.JComboBox();
        label_num_piece = new javax.swing.JLabel();
        num_piece = new javax.swing.JTextField();
        label_num_ligne_piece = new javax.swing.JLabel();
        num_ligne_piece = new javax.swing.JTextField();
        label_code_produit = new javax.swing.JLabel();
        code_produit = new javax.swing.JTextField();
        label_id_tiers = new javax.swing.JLabel();
        id_tiers = new javax.swing.JTextField();
        jSeparator1 = new javax.swing.JSeparator();
        cancel_button = new javax.swing.JButton();
        save_button = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Création d'une Référence Comptable");

        jLabel1.setText("Domaine");

        domaines.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "01 - Dépense", "02 - Recette", "04 - Budget", "06 - Marché" }));
        domaines.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                domainesItemStateChanged(evt);
            }
        });

        jLabel2.setText("Exercice");

        exercice.addCaretListener(new javax.swing.event.CaretListener() {
            public void caretUpdate(javax.swing.event.CaretEvent evt) {
                exerciceCaretUpdate(evt);
            }
        });

        label_type_piece.setText("Type de pièce");

        label_num_piece.setText("Numéro de Mandat");

        num_piece.addCaretListener(new javax.swing.event.CaretListener() {
            public void caretUpdate(javax.swing.event.CaretEvent evt) {
                num_pieceCaretUpdate(evt);
            }
        });

        label_num_ligne_piece.setText("Numéro de Ligne de Mandat");

        label_code_produit.setText("Code Produit");

        label_id_tiers.setText("Identifiant Tiers");

        cancel_button.setText("Annuler");
        cancel_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancel_buttonActionPerformed(evt);
            }
        });

        save_button.setText("Enregistrer");
        save_button.setEnabled(false);
        save_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                save_buttonActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(10, 10, 10)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(label_code_produit)
                    .add(label_num_ligne_piece)
                    .add(label_num_piece)
                    .add(label_type_piece)
                    .add(jLabel1)
                    .add(jLabel2)
                    .add(label_id_tiers))
                .add(18, 18, 18)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(type_piece, 0, 353, Short.MAX_VALUE)
                    .add(exercice, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .add(num_piece, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .add(num_ligne_piece, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .add(code_produit, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .add(id_tiers, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 353, Short.MAX_VALUE)
                    .add(domaines, 0, 353, Short.MAX_VALUE))
                .addContainerGap())
            .add(jSeparator1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap(343, Short.MAX_VALUE)
                .add(cancel_button)
                .add(18, 18, 18)
                .add(save_button)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel1)
                    .add(domaines, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(15, 15, 15)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(exercice, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel2))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(label_type_piece)
                            .add(type_piece, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(12, 12, 12)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(label_num_piece)
                            .add(num_piece, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(18, 18, 18)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(label_num_ligne_piece)
                            .add(num_ligne_piece, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(18, 18, 18)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(label_code_produit)
                            .add(code_produit, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(layout.createSequentialGroup()
                                .add(17, 17, 17)
                                .add(id_tiers, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                            .add(layout.createSequentialGroup()
                                .add(18, 18, 18)
                                .add(label_id_tiers))))
                    .add(layout.createSequentialGroup()
                        .add(224, 224, 224)
                        .add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(save_button)
                    .add(cancel_button))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void domainesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_domainesItemStateChanged
        initComportement();
    }//GEN-LAST:event_domainesItemStateChanged

    private void cancel_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancel_buttonActionPerformed
        setVisible(false);
    }//GEN-LAST:event_cancel_buttonActionPerformed

    private void save_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_save_buttonActionPerformed
        saveRefCompta();
    }//GEN-LAST:event_save_buttonActionPerformed

    private void saveRefCompta(){
        if(isValidForm()){
            String[] tabpce;
            if(type_piece.getSelectedItem().toString().contains("-")){
                tabpce = type_piece.getSelectedItem().toString().split(" - ");
            }else{
                tabpce = new String[2];
                tabpce[0] = "";
                tabpce[1] = "";
            }
             
            Pair typce = new Pair(tabpce[0],tabpce[1]);
            if(!isEdit){
                referenceComptable = new RefCompta(domaines.getSelectedItem().toString(),Integer.parseInt(exercice.getText()),typce,num_piece.getText(),num_ligne_piece.getText(),code_produit.getText(),id_tiers.getText());
            }else{
                referenceComptable.modifRefCompta(domaines.getSelectedItem().toString(),Integer.parseInt(exercice.getText()),typce,num_piece.getText(),num_ligne_piece.getText(),code_produit.getText(),id_tiers.getText());
            }
            bRet = true;
            setVisible(false);
        }
    }
    
    private void exerciceCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_exerciceCaretUpdate
        doCheck();
    }//GEN-LAST:event_exerciceCaretUpdate

    private void num_pieceCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_num_pieceCaretUpdate
        doCheck();
    }//GEN-LAST:event_num_pieceCaretUpdate
    
    public boolean run() {
        initComportement();
        setVisible(true);
        return bRet;
    }
    
    public boolean runEdit(RefCompta rc) {
        isEdit=true;
        referenceComptable=rc;
        initComportement();
        initDlg();
        setVisible(true);
        return bRet;
    }
    
    private void initComportement(){
        String domaine = this.domaines.getSelectedItem().toString();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        exercice.setText(sdf.format(new Date()));
        type_piece.removeAllItems();
        if (domaine.contains("Dépense")) {
            // Remplissage de la combo box
            type_piece.addItem("01 - Mandat ordinaire");
            type_piece.addItem("02 - Mandat correctif");
            type_piece.addItem("03 - Mandat d'ordre budgétaire");
            type_piece.addItem("04 - Mandat d'ordre mixte");
            type_piece.addItem("05 - Mandat émis après paiement");
            type_piece.addItem("06 - Mandat global");
            type_piece.addItem("07 - Mandat d'admission en non valeurs");
            type_piece.addItem("08 - Mandat collectif");
            type_piece.addItem("09 - Mandat sur marché");
            type_piece.addItem("10 - Mandat de rattachement");
            type_piece.addItem("11 - Ordre de paiement");
            type_piece.addItem("12 - Demande émission mandat");
            type_piece.addItem("13 - Charges constatées d'avance");
            
            // Modification des labels
            changeLabelPiece("Numéro de Mandat");
            changeLabelLignePiece("Numéro de ligne de Mandat");
            
            // Désactivation ou activation de labels ou de champs
            enabledLignePiece();
            disabledCodeProduit();
            disabledIdTiers();
        } else if (domaine.contains("Recette")) {
            // Remplissage de la combo box
            type_piece.addItem("01 - Titre ordinaire");
            type_piece.addItem("02 - Titre correctif");
            type_piece.addItem("03 - Titre d'ordre budgétaire");
            type_piece.addItem("04 - Titre d'ordre mixte");
            type_piece.addItem("05 - Titre émis après encaissement");
            type_piece.addItem("06 - Titre récapitulatif avec rôle");
            type_piece.addItem("07 - Titre récapitulatif sans rôle");
            type_piece.addItem("08 - Rôle titre");
            type_piece.addItem("09 - Titre de majoration");
            type_piece.addItem("10 - Titre en plusieurs années");
            type_piece.addItem("11 - Titre de rattachement");
            type_piece.addItem("12 - Ordre de recette ordonnateur");
            type_piece.addItem("13 - Demande émission de titre (P503)");
            type_piece.addItem("14 - Produits constatés d'avance");
            
            // Modification des labels
            changeLabelPiece("Numéro de Titre ou de Rôle");
            changeLabelLignePiece("Numéro de ligne de Titre ou de Rôle");
            
            // Désactivation ou activation de labels ou de champs
            enabledLignePiece();
            enabledCodeProduit();
            disabledIdTiers();
        } else if (domaine.contains("Budget")) {
            // Remplissage de la combo box
            type_piece.addItem("01 - Budget primitif, (autorisation budgétaire)");
            type_piece.addItem("02 - Décision modificative");
            type_piece.addItem("03 - Budget supplémentaire");
            type_piece.addItem("04 - Virement de crédit");
            type_piece.addItem("05 - Restes à réaliser (reports de crédit )");
            type_piece.addItem("06 - Délibération spéciale");
            type_piece.addItem("07 - Budget de référence");
            type_piece.addItem("08 - Budget de saisine");
            type_piece.addItem("09 - Compte administratif");
            
            // Désactivation ou activation de labels ou de champs
            disabledLignePiece();
            disabledCodeProduit();
            disabledIdTiers();
        } else if (domaine.contains("Marché")) {
            // Remplissage de la combo box
            type_piece.addItem("01 - Contrat initial");
            type_piece.addItem("02 - Avenant sans impact financier");
            type_piece.addItem("03 - Avenant positif");
            type_piece.addItem("04 - Avenant négatif");
            type_piece.addItem("05 - Avenant mixte positif");
            type_piece.addItem("06 - Avenant mixte négatif");
            type_piece.addItem("07 - Avenant de transfert");
            type_piece.addItem("08 - Acte spécial");
            type_piece.addItem("09 - Décision de poursuivre");
            
            // Désactivation ou activation de labels ou de champs
            disabledLignePiece();
            enabledCodeProduit();
            enabledIdTiers();           
        }
    }
    
    private void doCheck(){
        if(exercice.getText().length() == 4 && num_piece.getText().length() > 0){
            save_button.setEnabled(true);
        }else{
            save_button.setEnabled(false);
        }
    }
    
    private void changeLabelPiece(String text){
        label_num_piece.setText(text);
    }
    
    private void changeLabelLignePiece(String text){
        label_num_ligne_piece.setText(text);
    }
    
    private void enabledLignePiece(){
        num_ligne_piece.setEditable(true);
        label_num_ligne_piece.setEnabled(true);
    }
    
    private void disabledLignePiece(){
        num_ligne_piece.setEditable(false);
        num_ligne_piece.setText("");
        label_num_ligne_piece.setEnabled(false);
    }  
    
    private void enabledCodeProduit(){
        code_produit.setEnabled(true);
        label_code_produit.setEnabled(true);
    }
    
    private void disabledCodeProduit(){
        code_produit.setEnabled(false);
        code_produit.setText("");
        label_code_produit.setEnabled(false);
    }
    
    private void enabledIdTiers(){
        id_tiers.setEnabled(true);
        label_id_tiers.setEnabled(true);
    }
    
    private void disabledIdTiers(){
        id_tiers.setEnabled(false);
        id_tiers.setText("");
        label_id_tiers.setEnabled(false);
    }
    
    private boolean isValidForm(){
        String message = "";
        JTextField jtf;
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        if(!(exercice.getText().matches("[0-9][0-9][0-9][0-9]"))){
            message = "L'exercice doit contenir 4 chiffres de 0 à 9.";
            jtf = exercice;
        }else if(Integer.parseInt(exercice.getText()) > Integer.parseInt(sdf.format(d))){
            message = "L'exercice ne peut être supérieur à l'année en cours.";
            jtf = exercice;
        }else if(num_piece.getText().length() == 0){
            message = "Le numéro de mandat est obligatoire.";
            jtf = num_piece;
        }else if(Math.abs(Integer.parseInt(exercice.getText()) - Integer.parseInt(sdf.format(d))) > 3){
            JOptionPane.showMessageDialog(this,"Attention, l'exercice saisit a plus de trois ans.","Avertissement",JOptionPane.INFORMATION_MESSAGE);
            return true;
        } else {
            return true;
        }
        JOptionPane.showMessageDialog(this,message,"Erreur de saisie d'informations",JOptionPane.ERROR_MESSAGE);
        jtf.requestFocus();
        return false;
    }
    
    public RefCompta getReferenceComptable() {
        return this.referenceComptable;
    }
    
    private void initDlg(){
        for(int i=0;i<domaines.getItemCount();i++){
            if(domaines.getItemAt(i).equals(referenceComptable.getDomaine())){
                domaines.setSelectedIndex(i);
            }
        }
        exercice.setText(referenceComptable.getExercice().toString());
        for(int i=0;i<type_piece.getItemCount();i++){
            if(type_piece.getItemAt(i).toString().contains(referenceComptable.getTypePiece().key)){
                type_piece.setSelectedIndex(i);
            }
        }
        num_piece.setText(referenceComptable.getNumPiece());
        num_ligne_piece.setText(referenceComptable.getNumLignePiece());
        code_produit.setText(referenceComptable.getCodeProduit());
        id_tiers.setText(referenceComptable.getIdTiers());
    }
    
     @Override
    protected JRootPane createRootPane() {    
        KeyStroke ksEsc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
        KeyStroke ksEnter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0);
        
	JRootPane rp = new JRootPane();
        escapeAction = new AbstractActionExt("Fermer") {
		    /**
             * Comment for <code>serialVersionUID</code>
             */
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent evt) {
		        setVisible(false);
		    }

            public void itemStateChanged(ItemEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }

        	};
        
        enterAction = new AbstractActionExt("Save") {
		    /**
             * Comment for <code>serialVersionUID</code>
             */
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent evt) {
		        saveRefCompta();
		    }

            public void itemStateChanged(ItemEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }

        	};
	rp.registerKeyboardAction(escapeAction,"TOTOTOTO",ksEsc,JComponent.WHEN_IN_FOCUSED_WINDOW);
        rp.registerKeyboardAction(enterAction,"TOTOTOTO",ksEnter,JComponent.WHEN_IN_FOCUSED_WINDOW);
	return rp;
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton cancel_button;
    private javax.swing.JTextField code_produit;
    private javax.swing.JComboBox domaines;
    private javax.swing.JTextField exercice;
    private javax.swing.JTextField id_tiers;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JLabel label_code_produit;
    private javax.swing.JLabel label_id_tiers;
    private javax.swing.JLabel label_num_ligne_piece;
    private javax.swing.JLabel label_num_piece;
    private javax.swing.JLabel label_type_piece;
    private javax.swing.JTextField num_ligne_piece;
    private javax.swing.JTextField num_piece;
    private javax.swing.JButton save_button;
    private javax.swing.JComboBox type_piece;
    // End of variables declaration//GEN-END:variables
    
}
