package org.agnitas.beans.impl;
import org.agnitas.beans.ImportProfile;
import org.agnitas.beans.ProfileRecipientFields;
import org.agnitas.service.csv.Toolkit;
import org.agnitas.service.impl.CSVColumnState;
import org.agnitas.util.ImportUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.sql.Timestamp;
import java.util.*;
public class ImportKeyColumnsKey {
public static final String KEY_COLUMN_PREFIX = "key_column_";
private Map<String, CSVColumnState> keyColumnsMap;
private Map<String, Object> keyColumnsValues;
private Map<String, String> rawValues;
private ImportKeyColumnsKey() {
keyColumnsMap = new HashMap<String, CSVColumnState>();
keyColumnsValues = new HashMap<String, Object>();
rawValues = new HashMap<String, String>();
}
public static ImportKeyColumnsKey createInstance(final ImportProfile profile, final ProfileRecipientFields recipientFields, final CSVColumnState[] columns) {
ImportKeyColumnsKey key = new ImportKeyColumnsKey();
List<String> keyColumns = profile.getKeyColumns();
String keyColumn = profile.getKeyColumn();
for (CSVColumnState column : columns) {
String colName = column.getColName();
if (keyColumns.isEmpty() && colName.equals(keyColumn) && column.getImportedColumn()) {
key.getKeyColumnsMap().put(colName, column);
String value = Toolkit.getValueFromBean(recipientFields, profile.getKeyColumn());
value = value.toLowerCase();
key.getRawValues().put(colName, value);
key.getKeyColumnsValues().put(colName, formatValue(value, profile, column.getType()));
} else if (keyColumns.contains(colName) && column.getImportedColumn()) {
key.getKeyColumnsMap().put(colName, column);
String value = Toolkit.getValueFromBean(recipientFields, colName);
value = value.toLowerCase();
key.getRawValues().put(colName, value);
key.getKeyColumnsValues().put(colName, formatValue(value, profile, column.getType()));
}
}
return key;
}
public static ImportKeyColumnsKey createInstance(Map row) {
ImportKeyColumnsKey key = new ImportKeyColumnsKey();
Iterator<String> iterator = row.keySet().iterator();
while (iterator.hasNext()) {
String dbColumn = iterator.next();
if(dbColumn.equalsIgnoreCase("customer_id"))
continue;
String columnName = dbColumn.substring(KEY_COLUMN_PREFIX.length()).toLowerCase();
Object dbValue = row.get(dbColumn) != null ? row.get(dbColumn): "";
String value = String.valueOf(dbValue).toLowerCase();
key.getRawValues().put(columnName, value);
key.getKeyColumnsValues().put(columnName, value);
}
return key;
}
private static Object formatValue(String rawValue, ImportProfile profile, int type) {
Object value = null;
if (type == CSVColumnState.TYPE_CHAR) {
value = rawValue;
} else if (type == CSVColumnState.TYPE_NUMERIC) {
value = Double.valueOf(rawValue);
} else {
Date date = ImportUtils.getDateAsString(rawValue, profile.getDateFormat());
final Date sqlDate = new Timestamp(date.getTime());
value = String.valueOf(sqlDate.toString());
}
return value;
}
public Map<String, CSVColumnState> getKeyColumnsMap() {
return keyColumnsMap;
}
public Map<String, Object> getKeyColumnsValues() {
return keyColumnsValues;
}
public Map<String, String> getRawValues() {
return rawValues;
}
public void addParameters(Map<String, List<Object>> parameters) {
Iterator<String> iterator = keyColumnsValues.keySet().iterator();
while (iterator.hasNext()) {
String columnName = iterator.next();
Object columnValue = keyColumnsValues.get(columnName);
List<Object> objectList = parameters.get(columnName);
if(objectList == null){
objectList = new ArrayList<Object>();
parameters.put(columnName, objectList);
}
objectList.add(columnValue);
}
}
public String getParametersString() {
return " ?,";
}
@Override
public int hashCode() {
HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
for(String rawValue : rawValues.values()){
hashCodeBuilder.append(rawValue);
}
return hashCodeBuilder.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (obj.getClass() != getClass())
return false;
ImportKeyColumnsKey key = (ImportKeyColumnsKey) obj;
return this.getRawValues().equals(key.getRawValues());
}
}