package service;
import api.v1.DistributionlistParams;
import exceptions.PoseidonException;
import models.CustomerModel;
import models.OrderModel;
import models.RecipientModel;
import org.joda.time.DateTime;
import play.mvc.Http;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
public class DistributionlistsService extends PoseidonService {
public DistributionlistsService(String user) {
super(user);
}
public List<CustomerModel> findActiveCustomers(DistributionlistParams distributionlistParams) {
List<CustomerModel> result = new ArrayList<>();
Map<CustomerModel,Boolean> map = new HashMap<>();
List<OrderModel> activeOrders = findActiveOrders(distributionlistParams);
// extract distinct customers
for (OrderModel activeOrder : activeOrders) {
if ( !map.containsKey(activeOrder.customer)){
map.put(activeOrder.customer,Boolean.TRUE);
}
}
for (CustomerModel customerModel : map.keySet()) {
result.add(customerModel);
}
return result;
}
public List<OrderModel> findActiveOrders(DistributionlistParams distributionlistParams) {
List<OrderModel> result = new ArrayList<>();
DateTime dateTime = new DateTime(distributionlistParams.date,getTimeZone());
OrderService orderService = new OrderService(getUser());
List<OrderModel> orders = orderService.getOrdersForDate(dateTime);
for (OrderModel order : orders) {
order.assignStatus(getNow());
Set<Integer> activeTermins = order.getActiveTerminsForDayContainingTimestamp(dateTime);
if ( activeTermins == null) continue ;
for (int i = 0; i < distributionlistParams.termins.length; i++) {
api.v1.Termin t = distributionlistParams.termins[i];
if ( activeTermins.contains(t.hour) && t.selected ){
result.add(order);
break;
}
}
}
return result;
}
public List<RecipientModel> findRecipients(DistributionlistParams distributionlistParams){
List<RecipientModel> recipientModels = new ArrayList<>();
List<OrderModel> orderModels = findActiveOrders(distributionlistParams);
switch (distributionlistParams.mode){
case ALL:
for (OrderModel orderModel : orderModels) {
List<RecipientModel> orderRecipients = orderModel.recipients;
for (RecipientModel orderRecipient : orderRecipients) {
if ( !recipientModels.contains(orderRecipient))
recipientModels.add(orderRecipient);
}
}
break;
case ORDER:
for (OrderModel orderModel : orderModels) {
if ( orderModel.met_ref.equals(distributionlistParams.met_ref)) {
List<RecipientModel> orderRecipients = orderModel.recipients;
for (RecipientModel orderRecipient : orderRecipients) {
if (!recipientModels.contains(orderRecipient))
recipientModels.add(orderRecipient);
}
}
}
break;
case CUSTOMER:
for (OrderModel orderModel : orderModels) {
if ( orderModel.customer.name.equals(distributionlistParams.customer)) {
List<RecipientModel> orderRecipients = orderModel.recipients;
for (RecipientModel orderRecipient : orderRecipients) {
if (!recipientModels.contains(orderRecipient))
recipientModels.add(orderRecipient);
}
}
}
break;
default:
break;
}
return recipientModels;
}
public String writeRecipientsToDisk(DistributionlistParams params, List<RecipientModel> recipientModels) {
String csv = createCSV(params,recipientModels);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String id = "" ;
switch (params.mode){
case ALL:
id = "all";
break;
case ORDER:
id = params.met_ref;
break;
case CUSTOMER:
id = params.customer;
break;
}
String filename = "offshore_" + id + "_" + sdf.format(new Date()) + ".csv";
String csvdir = getCsvDirectory();
new CsvWriter().writeCsvToFile(csv, filename, csvdir);
return filename;
}
private String getCsvDirectory() {
String csvdir = PoseidonPropertyService.getProperty("csvfile.distributionlist.dir");
return csvdir.endsWith("/")?csvdir:csvdir + "/";
}
private String createCSV(DistributionlistParams params, List<RecipientModel> recipientModels) {
String CSV_COLUMN_HEADER = "Name,Group Membership,E-mail1-Type,E-mail1-Value\n";
String type = "Work";
String group ="";
switch (params.mode) {
case ALL:
group = "All";
break;
case ORDER:
group = params.met_ref;
break;
case CUSTOMER:
group = params.customer;
break;
}
StringBuilder builder = new StringBuilder(CSV_COLUMN_HEADER);
for (RecipientModel recipientModel : recipientModels) {
builder
.append("").append(",")
.append(group).append(",")
.append(type).append(",")
.append(recipientModel.email).append("\n");
}
return builder.toString();
}
}