package com.constellio.app.modules.es.model.connectors;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import com.constellio.app.modules.es.model.connectors.structures.TraversalSchedule;
import com.constellio.app.modules.es.services.mapping.ConnectorField;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.RecordWrapper;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.structures.MapStringListStringStructure;
public class ConnectorInstance<T extends ConnectorInstance> extends RecordWrapper {
public static final String SCHEMA_TYPE = "connectorInstance";
public static final String DEFAULT_SCHEMA = SCHEMA_TYPE + "_default";
public static final String CODE = "code";
public static final String TRAVERSAL_CODE = "traversalCode";
public static final String LAST_TRAVERSAL_ON = "lastTraversalOn";
public static final String CONNECTOR_TYPE = "connectorType";
public static final String ENABLED = "enabled";
public static final String PROPERTIES_MAPPING = "propertiesMapping";
public static final String AVAILABLE_FIELDS = "availableFields";
public static final String TRAVERSAL_SCHEDULE = "traversalSchedule";
public ConnectorInstance(Record record, MetadataSchemaTypes types) {
super(record, types, "connector");
}
protected ConnectorInstance(Record record, MetadataSchemaTypes types, String schemaCode) {
super(record, types, schemaCode);
}
public String getCode() {
return get(CODE);
}
public ConnectorInstance setCode(String code) {
this.set(CODE, code);
return this;
}
@Override
public ConnectorInstance setTitle(String title) {
super.setTitle(title);
return this;
}
public Boolean getEnabled() {
return get(ENABLED);
}
public boolean isEnabled() {
Boolean enabled = getEnabled();
return enabled != null && enabled;
}
public T setEnabled(Boolean enabled) {
set(ENABLED, enabled);
return (T) this;
}
public List<ConnectorField> getAvailableFields() {
return getList(AVAILABLE_FIELDS);
}
public T setAvailableFields(List<ConnectorField> availableFields) {
this.set(AVAILABLE_FIELDS, availableFields);
return (T) this;
}
public String getConnectorType() {
return get(CONNECTOR_TYPE);
}
public T setConnectorType(String connectorType) {
this.set(CONNECTOR_TYPE, connectorType);
return (T) this;
}
public T setConnectorType(Record connectorType) {
this.set(CONNECTOR_TYPE, connectorType);
return (T) this;
}
public T setConnectorType(ConnectorType connectorType) {
this.set(CONNECTOR_TYPE, connectorType);
return (T) this;
}
public String getDocumentsCustomSchemaCode() {
return getId().replace("-", "");
}
public MapStringListStringStructure getPropertiesMapping() {
return get(PROPERTIES_MAPPING);
}
public T setPropertiesMapping(MapStringListStringStructure propertiesMapping) {
this.set(PROPERTIES_MAPPING, propertiesMapping);
return (T) this;
}
public String getTraversalCode() {
return this.get(TRAVERSAL_CODE);
}
public T setTraversalCode(String traversalCode) {
this.set(TRAVERSAL_CODE, traversalCode);
return (T) this;
}
public LocalDateTime getLastTraversalOn() {
return this.get(LAST_TRAVERSAL_ON);
}
public T setLastTraversalOn(LocalDateTime lastTraversalOn) {
this.set(LAST_TRAVERSAL_ON, lastTraversalOn);
return (T) this;
}
public String readToken(String code) {
return "r" + getId() + code;
}
public List<TraversalSchedule> getTraversalSchedule() {
return getList(TRAVERSAL_SCHEDULE);
}
public List<TraversalSchedule> getValidTraversalSchedule() {
List<TraversalSchedule> validSchedules = new ArrayList<>();
for (TraversalSchedule schedule : getTraversalSchedule()) {
if (schedule.isValid()) {
validSchedules.add(schedule);
}
}
return validSchedules;
}
public T setTraversalSchedule(List<TraversalSchedule> traversalSchedule) {
this.set(TRAVERSAL_SCHEDULE, traversalSchedule);
return (T) this;
}
public boolean isCurrentlyRunning() {
LocalDateTime currentTime = TimeProvider.getLocalDateTime();
DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm");
List<TraversalSchedule> traversalSchedules = getValidTraversalSchedule();
if (traversalSchedules.isEmpty()) {
return true;
}
for (TraversalSchedule schedule : traversalSchedules) {
if (schedule.getWeekDay() == currentTime.getDayOfWeek()) {
LocalDateTime startTime = formatter.parseLocalDateTime(schedule.getStartTime());
LocalDateTime endTime = formatter.parseLocalDateTime(schedule.getEndTime());
if (startTime.getHourOfDay() == 0 && startTime.getMinuteOfHour() == 0 && endTime.getHourOfDay() == 0 && endTime.getMinuteOfHour() == 0) {
return true;
} else if (startTimeBeforeCurrentTime(startTime, currentTime) && endTimeAfterCurrentTime(endTime, currentTime)) {
return true;
}
}
}
return false;
}
private boolean startTimeBeforeCurrentTime(LocalDateTime startTime, LocalDateTime currentTime) {
if (startTime.getHourOfDay() == currentTime.getHourOfDay()) {
if (startTime.getMinuteOfHour() < currentTime.getMinuteOfHour()) {
return true;
}
} else if (startTime.getHourOfDay() < currentTime.getHourOfDay()) {
return true;
}
return false;
}
private boolean endTimeAfterCurrentTime(LocalDateTime endTime, LocalDateTime currentTime) {
if (endTime.getHourOfDay() == currentTime.getHourOfDay()) {
if (endTime.getMinuteOfHour() > currentTime.getMinuteOfHour()) {
return true;
}
} else if (endTime.getHourOfDay() > currentTime.getHourOfDay()) {
return true;
}
return false;
}
}