package org.wikiwebserver.sync.gui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import javax.swing.border.TitledBorder;

import org.wikiwebserver.sync.Syncher;

public class ProcessingPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = 1L;

    private Timer timer;
    private JSiteSync gui;
    private Syncher syncher;
    private Syncher.Action action;
    
    
    private long totalSyncBytes;
    private int totalCommands;
    private JProgressBar progress;
    private JLabel itemLabel;
    
    public ProcessingPanel(JSiteSync gui, Syncher syncher, Syncher.Action action) {
        this.gui = gui;
        this.syncher = syncher;
        this.action = action;

        if (action == Syncher.Action.DIFF) {
            setLayout(new BorderLayout());        
    
            setBorder(new TitledBorder("Analysing directories"));
    
            progress = new JProgressBar();
            progress.setIndeterminate(true);
            
            add(progress);
        }
        else if (action == Syncher.Action.SYNC) {
        
            setLayout(new BorderLayout());        
    
            setBorder(new TitledBorder("Synchronizing directories"));
    
            progress = new JProgressBar(0, (int) syncher.getTotalSyncProcessingUnits());
            progress.setIndeterminate(false);
            progress.setStringPainted(true);
            totalSyncBytes = syncher.getTotalSyncBytes();
            totalCommands = syncher.getSyncCommands().getFileItemsInOperationOrder().size();
            progress.setString(syncher.getSyncProgessString(totalSyncBytes, totalCommands));
            
            add(progress, BorderLayout.CENTER);
            
            itemLabel = new JLabel("Pending...");
            add(itemLabel, BorderLayout.SOUTH);
        }
        
        timer = new Timer(100, this);
        timer.start();        
    }

    public void actionPerformed(ActionEvent e) {
        
        
        if (syncher.getException() != null) {
            gui.showException();
            progress.setStringPainted(true);
            progress.setString(syncher.getException().getMessage());
        }        
        else if (action == Syncher.Action.DIFF) {
            
            if (syncher.isComplete()) {
                gui.showDifferences();
            }            
            
        } else if (action == Syncher.Action.SYNC) {
            
            int value = (int) syncher.getSyncProcessingUnits();
            progress.setValue(value);
            progress.setString(syncher.getSyncProgessString(totalSyncBytes, totalCommands));        

            if (syncher.isComplete()) {
                itemLabel.setText("Synchronization complete!");
            }
            else {
                itemLabel.setText(syncher.getCurrentTask());
            }
        }
        
        if (syncher.isComplete()) {
            gui.updateButtons();
            timer.stop();
            progress.setIndeterminate(false);
        }
    }    
}

