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.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;

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, long 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();
}
