package fr.openwide.core.imports.table.common.event;

import fr.openwide.core.imports.table.common.event.TableImportEvent.ExcelImportErrorEvent;
import fr.openwide.core.imports.table.common.event.TableImportEvent.ExcelImportInfoEvent;
import fr.openwide.core.imports.table.common.event.exception.TableImportContentException;
import fr.openwide.core.imports.table.common.event.exception.TableImportHeaderLabelMappingException;
import fr.openwide.core.imports.table.common.event.exception.TableImportMappingException;
import fr.openwide.core.imports.table.common.location.TableImportLocation;

/**
 * An interface for classes handling excel import events (mainly errors for the moment).
 * <p>This class assumes that excel import include error-tolerant phases (for instance, when doing only data loading), and phases where no error can be tolerated
 * (for instance, when using the loaded data are used to update database entities). That's the point of the {@link #checkNoErrorOccurred()} method: implementors may choose
 * to silently stack errors when {@link #error(String, TableImportLocation)} or {@link #missingValue(String, TableImportLocation)} are called, and delay exception throwing
 * until {@link #checkNoErrorOccurred()} is called.
 */
public interface ITableImportEventHandler {
	
	void headerLabelMappingError(String expectedHeaderLabel, int indexAmongMatchedColumns, TableImportLocation location) throws TableImportHeaderLabelMappingException;
	
	void checkNoMappingErrorOccurred() throws TableImportMappingException;
	
	void event(ExcelImportErrorEvent event, TableImportLocation location, String message, Object ... args) throws TableImportContentException;
	
	void event(ExcelImportInfoEvent event, TableImportLocation location, String message, Object ... args);
	
	/**
	 * Checks that no error occurred since the last call to {@link #checkNoErrorOccurred()} or {@link #resetErrors()}, throwing an exception if an error has actually occurred.
	 */
	void checkNoErrorOccurred() throws TableImportContentException;
	
	void resetErrors();
	
}
