/**
 * 
 */
package eu.dnetlib.data.collective.manager.ui;

import java.util.LinkedList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
import org.zkoss.zul.event.PagingEvent;

import eu.dnetlib.data.collective.manager.IInstanceService;
import eu.dnetlib.data.collective.manager.profile.AbstractInstance;

/**
 * @author jochen
 *
 */
public class AbstractSchedulingUiController<S extends IInstanceService> extends GenericForwardComposer implements IUiController{

	/**
	 * 
	 */
	private static final long serialVersionUID = 2778554708549475413L;
	@SuppressWarnings("unused")
	private static final Log log = LogFactory.getLog(AbstractSchedulingUiController.class);
	protected Window schedulingControllerWin;
	protected Listbox instanceUiList;
	protected ListModelList instanceUiListModelList = new ListModelList();
	protected ListitemRenderer schedulingListrenderer; // = new SchedulingListRenderer();
	@Resource
	protected S instanceService;
	
	protected String serviceName = "undefined";
	
	protected String styleSrc;
	protected String favIcon;

	protected Button btn_repositorySearch;
	protected Paging paging_instancesList;
	protected Textbox txtbx_repositoryName;

	/**
	 * @see org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.zk.ui.Component)
	 */
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		schedulingControllerWin.getPage().setTitle(serviceName + " - " + schedulingControllerWin.getPage().getTitle());
		
		paging_instancesList.addEventListener("onPaging", new EventListener() {
			
			@Override
			public void onEvent(Event aEvent) throws Exception {
				PagingEvent pe = (PagingEvent)aEvent;
				int pageNo = pe.getActivePage();
				int start = pageNo * paging_instancesList.getPageSize();
				refreshModel(txtbx_repositoryName.getValue().trim().toLowerCase(), start);
			}
		});
		
		btn_repositorySearch.addEventListener("onClick", new EventListener() {
			
			@Override
			public void onEvent(Event arg0) throws Exception {
				refreshModel(txtbx_repositoryName.getValue().trim().toLowerCase(), 0);
			}
		});
		
		instanceUiList = (Listbox)schedulingControllerWin.getFellow("instanceUiList");
		
		//((ListModelList)instanceUiList.getModel()).addAll( instanceService.getAllInstances() ); //  InstanceManager().getInstanceRegistry().getInstanceList() );
		refreshModel("", 0);
		instanceService.addUiController(this);
	}
	
	@SuppressWarnings("unchecked")
	private void refreshModel(String searchStr, int aStart){
		instanceUiListModelList.clear();
		int toIndex = aStart + paging_instancesList.getPageSize();

		
		List<AbstractInstance> results = new LinkedList<AbstractInstance>();
		if (searchStr.length() > 0){
			for (AbstractInstance instance: (List<AbstractInstance>) instanceService.getAllInstances()){
				if (instance.getRepositoryName().toLowerCase().contains(searchStr)){
					results.add(instance);
				}
			}
		}else{
			results = (List<AbstractInstance>)instanceService.getAllInstances();
		}
		paging_instancesList.setTotalSize(results.size());
		if (toIndex > results.size())	toIndex = results.size();
		instanceUiListModelList = new ListModelList(results.subList(aStart, toIndex));
		instanceUiList.setModel(instanceUiListModelList);
	}
	
	public void onClick$btn_servicePreferences(Event aEvent)throws Exception{
		schedulingControllerWin.setAttribute("instanceService", instanceService);
		Window preferences = (Window)Executions.createComponents("/WEB-INF/pages/preferences.zul",self, null);
		preferences.doModal();
	}
	/**
	 * @return
	 */
	public S getInstanceService() {
		return instanceService;
	}

	/**
	 * @param instanceService
	 */
	public void setInstanceService(S instanceService) {
		this.instanceService = instanceService;
	}

	/**
	 * @return
	 */
	public ListModel getInstanceUiListModelList(){
		return this.instanceUiListModelList;
	}
	
	/**
	 * @return
	 */
	public ListitemRenderer getSchedulingListrenderer(){
		return this.schedulingListrenderer;
	}

	/**
	 * @param aItemRenderer
	 */
	public void setSchedulingListrenderer(ListitemRenderer aItemRenderer){
		this.schedulingListrenderer = aItemRenderer;
	}

	/**
	 * @return the serviceName
	 */
	public String getServiceName() {
		return serviceName;
	}

	/**
	 * @param serviceName the serviceName to set
	 */
	public void setServiceName(String serviceName) {
		this.serviceName = serviceName;
	}

	/**
	 * @return the styleSrc
	 */
	public String getStyleSrc() {
		return styleSrc;
	}

	/**
	 * @param styleSrc the styleSrc to set
	 */
	public void setStyleSrc(String styleSrc) {
		this.styleSrc = styleSrc;
	}
	
//	@Override
//	public boolean updateUI(ServiceActivity aServiceActivity) {
//		log.debug("update list for instance id: " + aServiceActivity.getInstanceResourceId());
//		try {
//			
//			ListModelList lml = (ListModelList)instanceUiList.getModel();
//			Executions.activate(desktop);
//			HarvestingInstance instance = instanceService.getInstanceManager().getInstanceRegistry().getInstance(aServiceActivity.getInstanceResourceId());
//			
//			if (lml.contains(instance)){
//				int index = lml.indexOf(instance);
//				lml.set(index, instance);
//			}
//			
//		} catch (DesktopUnavailableException e) {
//			log.error(e);
//		} catch (InterruptedException e) {
//			log.error(e);
//		}finally{
//			Executions.deactivate(desktop);
//		}
//		return false;
//	}

	/**
	 * @return the favicon
	 */
	public String getFavIcon() {
		return favIcon;
	}

	/**
	 * @param favicon the favicon to set
	 */
	public void setFavIcon(String favicon) {
		this.favIcon = favicon;
	}

}
