package org.wikiwebserver.distribute.se.gui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.NumberFormat;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;

import org.wikiwebserver.distribute.interfaces.Task;
import org.wikiwebserver.distribute.interfaces.TaskStateChangeListener;
import org.wikiwebserver.distribute.se.RemoteWorkerApp;
import org.wikiwebserver.distribute.se.ResourceManager;
import org.wikiwebserver.distribute.se.worker.ServerCommunicator;

public class JWorkerStatusPanel extends JPanel implements ActionListener, TaskStateChangeListener {
    
    private static final long serialVersionUID = 1L;    

	private static final NumberFormat numberFormat = NumberFormat.getInstance();
	private static final DateFormat dateFormat = DateFormat.getTimeInstance();
	
	private Timer timer;
	private JLabel lastTaskTimeLabel;
	private JLabel nextTaskDelayLabel;
	
	public JWorkerStatusPanel() {
		RemoteWorkerApp.getWorker().addTaskStateChangeListener(this);
		
		lastTaskTimeLabel = new JLabel();
		lastTaskTimeLabel.setBorder(new EmptyBorder(2, 5, 2, 5));
		nextTaskDelayLabel = new JLabel();
		nextTaskDelayLabel.setBorder(new EmptyBorder(2, 5, 2, 5));
		nextTaskDelayLabel.setToolTipText(ResourceManager.getString("delayTip"));
		
		JPanel statusLabels = new JPanel(new BorderLayout());
		statusLabels.add(lastTaskTimeLabel, BorderLayout.CENTER);
		statusLabels.add(nextTaskDelayLabel, BorderLayout.EAST);		
		
		setLayout(new BorderLayout());
		add(statusLabels, BorderLayout.EAST);
		
		timer = new Timer(200, this);
		timer.start();
	}

	public void taskStateChanged(Task task) {
		updateStatusInformation();
	}

	public void actionPerformed(ActionEvent arg0) {
		updateStatusInformation();
	}
	
	public void updateStatusInformation() {
	    
        String serverErrorMessage = ServerCommunicator.getError();
        if (serverErrorMessage != null) {
            nextTaskDelayLabel.setText(serverErrorMessage);
            return;
        }	   
	    
        String workerErrorMessage = RemoteWorkerApp.getWorker().getError();
        if (workerErrorMessage != null) {
            nextTaskDelayLabel.setText(workerErrorMessage);
            return;
        }            

		long lastTaskCheckTime = ServerCommunicator.getLastTaskCheckTime();
		if (lastTaskCheckTime > 0) {
			lastTaskTimeLabel.setText(dateFormat.format(lastTaskCheckTime));
		}
		
		long time = System.currentTimeMillis();
		long nextTaskStartTime = ServerCommunicator.getNextTaskCheckTime();
		if (time < nextTaskStartTime) {
			int delay = (int) (nextTaskStartTime - time);	
			String delayString = numberFormat.format(((delay+500)/1000));
			nextTaskDelayLabel.setText("[" + delayString + "]");
		}
		else nextTaskDelayLabel.setText("[C]");		
	}
	
	
}

