/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.ui.api.statemachine;

import java.nio.channels.SelectableChannel;
import java.util.Collection;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.runtime.common.filter.IQuery;
import org.eclipse.osbp.ui.api.customfields.IBlobService;
import org.eclipse.osbp.ui.api.message.MessageEvent;
import org.eclipse.osbp.ui.api.message.MessageEvent.EventType;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
import org.eclipse.osbp.ui.api.report.IReportProvider;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.user.IUser;
import org.joda.time.DateTime;

import com.vaadin.ui.VerticalLayout;

public interface IStateMachine {
	String getIPAddress();
	
	String getHostName();

	boolean isItMe(String hostName);
	
	DateTime getNow();

	void processEvent(IStateMachine statemachine, MessageEvent event);

	void registerEnabler(IEventSource.Enabler listener);

	void unregisterEnabler(IEventSource.Enabler listener);

	void registerDataProvider(IDataProvider.Provider listener);

	void unregisterDataProvider(IDataProvider.Provider listener);

	void start();

	void enable(String id, Boolean enable);

	void toggle(String id);

	Object get(String id);

	void set(String id, Object content);

	void set(String id, String device, Object content);
	
	void clear(String id);

	void append(String id, String key);

	void remove(String id, int pos);

	void caption(String id, String value);

	void image(String id, String imageName);
	
	void addDataProvider(IDataProvider.Provider listener);

	void removeDataProvider(IDataProvider.Provider listener);

	void registerPeripheral(IPeripheral.Command listener);

	void unregisterPeripheral(IPeripheral.Command listener);

	Boolean find(String dtoName, String fieldName, Object search);

	Boolean find(String dtoName, IQuery query);
	
	Collection<? extends IDto> findAll(String dtoAlias, IQuery query);

	Collection<? extends IDto> findAll(String dtoAlias, String fieldName, Object search);
	
	void addTo(String dtoName, String listName, IDto dto);

	void removeFrom(String dtoName, String listName, IDto dto);
	
	void update(String dtoName);

	void reload(String dtoName);

	void delete(String dtoName);

	String getUserAgentInfo();

	Boolean isTouchDevice();

	int getSceenWidth();

	int getScreenHeight();

	Locale getBrowserLocale();

	Boolean isHttps();

	void schedule(IStateMachine statemachine, int milliseconds,
			MessageEvent event);

	Double parseDouble(String doubleStr);

	String formatDouble(Double value, int length, int precision);

	void setUser(IUser user);

	IUser getUser();

	String getUserName();
	
	String getUserPassword();

	String getUserEmail();
	
	String getUserPosition();
	
	String getUserPrintService();
	
	void setLocale(Locale locale);

	Locale getLocale();

	void setDslMetadataService(IDSLMetadataService dslMetadataService);

	IDSLMetadataService getDslMetadataService();
	
	void setThemeResourceService(IThemeResourceService themeResourceService);
	
	IThemeResourceService getThemeResourceService();

	String getTranslation(String token);

	void closeMessage(String messageId);
	
	void setReportProvider(IReportProvider reportprovider);
	
	IReportProvider getReportProvider();

	void openMessage(String messageId);

	void openMessage(String messageId, boolean okButton);
	
	void openQuestion(String messageId, EventType type, String yesEvent, String noEvent, String cancelEvent);

	void dispatchMessages(MessageEvent event);
	
	Object getStorage(String key, String attribute);
	
	Set<String> getStorageAttributes(String key);

	void putStorage(String key, String attribute, Object content);
	
	void openChannel(SelectableChannel channel);
	
	SelectableChannel getChannel();
	
	void closeChannel();

	String getLastTrigger();
	
	void setEclipseContext(IEclipseContext eclipseContext);
	
	IEclipseContext getEclipseContext();
	
	void sendSlaveData(Map<String, Object> data);

	void setBlobService(IBlobService blobService);
	
	IBlobService getBlobService();
	
	void installKeyEventConsumer(VerticalLayout layout);

	void uninstallKeyEventConsumer();
	
	void blockQueueTaking(boolean block);
	
	boolean isJavaPosRemote();
	
	int getRemotePort();
	
	void setRemotePort(int port);
}
