package com.prime.sony.ecommerce.util;


import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
import com.amazonaws.services.simpleemail.model.Body;
import com.amazonaws.services.simpleemail.model.Content;
import com.amazonaws.services.simpleemail.model.Destination;
import com.amazonaws.services.simpleemail.model.Message;
import com.amazonaws.services.simpleemail.model.SendEmailRequest;
import com.prime.sony.ecommerce.exceptions.AutodataCheckServiceException;
import com.prime.sony.ecommerce.exceptions.DeleteRequestServiceException;
import com.prime.sony.ecommerce.exceptions.PipeStatusServiceException;
import com.prime.sony.ecommerce.exceptions.RowStatusServiceException;
import com.prime.sony.ecommerce.exceptions.TaskStatusServiceException;
import com.prime.sony.ecommerce.model.AutoDataChecks;
import com.prime.sony.ecommerce.model.DeleteRequest;
import com.prime.sony.ecommerce.model.DeleteRequestLog;
import com.prime.sony.ecommerce.model.Email;
import com.prime.sony.ecommerce.model.LogHistory;
import com.prime.sony.ecommerce.model.PipeStatus;
import com.prime.sony.ecommerce.model.RowCountStatus;
import com.prime.sony.ecommerce.model.TaskStatus;

@Component
public class MailService {

	private static final Logger log = LoggerFactory.getLogger(MailService.class);

	@Autowired
	private Email email;
	
	/*
	 * @Autowired private JobExecution jobExecution;
	 */
private static AmazonSimpleEmailService emailService;
	
	public MailService(@Value("${aws.region}") String region) {
		 try {
			 emailService = 
		          AmazonSimpleEmailServiceClientBuilder.standard()		         
		            .withRegion(region).build();
		      
		 } catch (Exception ex) {
		      System.out.println("AmazonSimpleEmailService failed to build. Error message: " 
		          + ex.getMessage());
		 }
	}
	
	
	public  void processEmail(String subject,String body) throws Exception{
	
		
		if(email.getEnv().equalsIgnoreCase("dev_")) {
			body=body+"</br></br> dev version:"+email.getVersion();	
			// SKIPPING EMAIL FROM DEV ENVIRONMENT
        	System.out.println("Skipping email send in DEV");
        	return;
		}
		
		String[] toEmailList = email.getTo().split(",");        
	        
	      SendEmailRequest request = new SendEmailRequest()
	    		    .withDestination(
	              new Destination().withToAddresses(toEmailList))
	          .withMessage(new Message()
	              .withBody(new Body()
	                  .withHtml(new Content()
	                      .withCharset("UTF-8").withData(body))
	                  .withText(new Content()
	                      .withCharset("UTF-8").withData("")))
	              .withSubject(new Content()
	                  .withCharset("UTF-8").withData(subject)))
	          .withSource(email.getFrom());
	         
	      emailService.sendEmail(request);	      
	      System.out.println("Email sent!");	   
	  }
	
	public void mailsendingForPipeSuccess(String object)
			throws PipeStatusServiceException {
		log.info("==>MailService.mailsendingForPipe()");
		
		try {
			Date jobEndDate = new Date();
			SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
			String jobEndTime = format.format(jobEndDate.getTime());
			String body = "";
			String subject="";
			String tableName=null;
			if(object.equalsIgnoreCase("PRODUCT")) {
				subject=email.getEnv()+"JOB COMPLETED: S3 to Snowflake PRODUCTS_STAGE";
				tableName = "PRODUCTS_STAGE";
			}else if(object.equalsIgnoreCase("CUSTOMER")) {
				subject=email.getEnv()+"JOB COMPLETED: S3 to Snowflake CUSTOMERS_STAGE";
				tableName = "CUSTOMERS_STAGE";
			}else if(object.equalsIgnoreCase("ORDER")) {
				subject=email.getEnv()+"JOB COMPLETED: S3 to Snowflake ORDERS_STAGE";
				tableName = "ORDERS_STAGE";
			}
			
			body =  "The feed from S3 to "+tableName+" was verified as having run successfully."
					+ "</br>" + "Completed at: " + jobEndTime + ".</br>"
					+"</br> </br> ";
			

			processEmail(subject,body);			

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsending()", e);
			throw new PipeStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsending()");
	}

	public void mailsendingForPipe(String object, List<PipeStatus> pipeStatusList)
			throws PipeStatusServiceException {
		log.info("==>MailService.mailsendingForPipe()");
		
		try {
			String body = "";
			String subject="";
			String tableName=null;
			if(object.equalsIgnoreCase("PRODUCT")) {
				subject=email.getEnv()+"JOB FAILED: "+pipeStatusList.get(0).getPipe_schema_name()+" - S3 to Snowflake PRODUCTS_STAGE";
				tableName = "PRODUCTS_STAGE";
			}else if(object.equalsIgnoreCase("CUSTOMER")) {
				subject=email.getEnv()+"JOB FAILED: "+pipeStatusList.get(0).getPipe_schema_name()+" - S3 to Snowflake CUSTOMERS_STAGE";
				tableName = "CUSTOMERS_STAGE";
			}else if(object.equalsIgnoreCase("ORDER")) {
				subject=email.getEnv()+"JOB FAILED: "+pipeStatusList.get(0).getPipe_schema_name()+" - S3 to Snowflake ORDERS_STAGE";
				tableName = "ORDERS_STAGE";
			}
							
			
			for (PipeStatus pipeStatus : pipeStatusList) {
				//LocalDateTime myDateObj = LocalDateTime(new DateTime());
				DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");

			    String formattedDate = pipeStatus.getLastLoadTime().format(myFormatObj);  
				body = body 
						+ 
						"</br> File Name: " + pipeStatus.getFileName()
						+ "</br> Failed Time: "  + formattedDate
						+ "</br> Error Message: "  + pipeStatus.getFirst_error_message()
						+ "</br> Error Column Name: "  + pipeStatus.getFirst_error_column_name()
						+ "</br> Error Line Number: "  + pipeStatus.getFirst_error_line_number()
						+ "</br> Destination Schema: "+pipeStatus.getPipe_schema_name()
						+"</br> ";
			}
			body =  "The feed for "+pipeStatusList.get(0).getPipe_schema_name()+" from S3 to "+tableName+" failed."
					+"</br></br>"
					+body
					+ "</br></br>" + "Please contact your Salesforce Engineering team for support.";

			processEmail(subject,body);			

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsending()", e);
			throw new PipeStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsending()");
	}
	
	
	public void mailsendingForTaskSuccess(String object)
			throws TaskStatusServiceException {
		log.info("==>MailService.mailsendingForTask()");
		String subject="";
		String body="";
		try {
			Date jobEndDate = new Date();
			SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
			String jobEndTime = format.format(jobEndDate.getTime());
			String sourceName=null;
			String targetName=null;
			if(object.equalsIgnoreCase("PRODUCT")) {
				sourceName = "PRODUCTS_STAGE";
				targetName = "PRODUCTS_SP";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMER")) {
				sourceName = "CUSTOMERS_STAGE";
				targetName = "CUSTOMERS_SP";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("ORDER")) {
				sourceName = "ORDERS_STAGE";
				targetName = "ORDERS_SP";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("PRODUCTSPTOECOMMERCE")) {
				sourceName = "PRODUCTS_SP";
				targetName = "ECOMMERCE_PRODUCTS";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERSPTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERLOOKUPTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS - CUSTOMER_ID_LOOKUP";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERTOTALSPENTTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE ";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
			}else if(object.equalsIgnoreCase("ORDERSPTOECOMMERCE")) {
				sourceName = "ORDERS_SP";
				targetName = "ECOMMERCE_ORDERS";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("PRODUCTTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_PRODUCTS";
				subject=email.getEnv()+"JOB COMPLETED: Shopify Schema to ECOMMERCE_PRODUCTS";
			}else if(object.equalsIgnoreCase("CUSTOMERTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS";
				subject=email.getEnv()+"JOB COMPLETED: Shopify Schema to ECOMMERCE_CUSTOMERS";
			}else if(object.equalsIgnoreCase("ORDERTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_ORDERS";
				subject=email.getEnv()+"JOB COMPLETED: Shopify Schema to ECOMMERCE_ORDERS";
			}else if(object.equalsIgnoreCase("CUSTOMERLOOKUPFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS - CUSTOMER_ID_LOOKUP";
				subject=email.getEnv()+"JOB COMPLETED: Shopify Schema to ECOMMERCE_CUSTOMERS – CUSTOMER_ID_LOOKUP";
			}else if(object.equalsIgnoreCase("CUSTOMERTOTALSPENTFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
			}else if(object.equalsIgnoreCase("ORDERTOTALQUANTITYUPDATEFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_ORDERS TOTAL_QUANTITY_UPDATE";
				subject=email.getEnv()+"JOB COMPLETED: Snowflake ECOMMERCE_ORDERS TOTAL_QUANTITY_UPDATE";
			}
			
			
			
			
			body="The feed  from "+sourceName+" to "+targetName+" was verified as having run successfully."
					+ "</br>" + "Completed at: " + jobEndTime + ".</br>"
					+"</br> </br> ";

			processEmail(subject,body);	

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsending()", e);
			throw new TaskStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForTask()");
	}
	
	public void mailsendingForTask(String object,List<TaskStatus> tasksList)
			throws TaskStatusServiceException {
		log.info("==>MailService.mailsendingForTask()");
		String subject="";
		String body="";
		try {
			
			String sourceName=null;
			String targetName=null;
			if(object.equalsIgnoreCase("PRODUCT")) {
				sourceName = "PRODUCTS_STAGE";
				targetName = "PRODUCTS_SP";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMER")) {
				sourceName = "CUSTOMERS_STAGE";
				targetName = "CUSTOMERS_SP";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("ORDER")) {
				sourceName = "ORDERS_STAGE";
				targetName = "ORDERS_SP";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("PRODUCTSPTOECOMMERCE")) {
				sourceName = "PRODUCTS_SP";
				targetName = "ECOMMERCE_PRODUCTS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERSPTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERLOOKUPTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS - CUSTOMER_ID_LOOKUP";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("CUSTOMERTOTALSPENTTOECOMMERCE")) {
				sourceName = "CUSTOMERS_SP";
				targetName = "ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE ";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
			}else if(object.equalsIgnoreCase("ORDERSPTOECOMMERCE")) {
				sourceName = "ORDERS_SP";
				targetName = "ECOMMERCE_ORDERS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake "+sourceName+" to "+targetName;
			}else if(object.equalsIgnoreCase("PRODUCTTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_PRODUCTS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Shopify Schema to ECOMMERCE_PRODUCTS";
			}else if(object.equalsIgnoreCase("CUSTOMERTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Shopify Schema to CUSTOMERS_SP to ECOMMERCE_CUSTOMERS";
			}else if(object.equalsIgnoreCase("ORDERTOECOMMERCEFROMSHOPIFY")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_ORDERS";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Shopify Schema to ECOMMERCE_ORDERS";
			}else if(object.equalsIgnoreCase("CUSTOMERLOOKUPFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS - CUSTOMER_ID_LOOKUP";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Shopify Schema to ECOMMERCE_CUSTOMERS – CUSTOMER_ID_LOOKUP";
			}else if(object.equalsIgnoreCase("CUSTOMERTOTALSPENTFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake ECOMMERCE_CUSTOMERS TOTAL_SPENT_UPDATE";
			}else if(object.equalsIgnoreCase("ORDERTOTALQUANTITYUPDATEFORSHOPIFYTOECOMMERCE")) {
				sourceName = "Shopify Schema";
				targetName = "ECOMMERCE_ORDERS TOTAL_QUANTITY_UPDATE";
				subject=email.getEnv()+"JOB FAILED: "+tasksList.get(0).getSchema_name()+" - Snowflake ECOMMERCE_ORDERS TOTAL_QUANTITY_UPDATE";
			}
			
			
			for (TaskStatus taskStatus : tasksList) {
				
		    	long millis =  Duration.between(taskStatus.getQuery_start_time(),taskStatus.getCompleted_time()).toMillis();
		    			 
				String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
	    	            TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
	    	            TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
				
				DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");

			    String formattedDate = taskStatus.getCompleted_time().format(myFormatObj);
				
				body = body+						
						 "Task Name: " + taskStatus.getName()
						+ "</br> Run Time: "  + hms
						+ "</br> Failed Time: "  + formattedDate
						+ "</br> Error Message: "  + taskStatus.getError_message()
					//	+ "\n\n"+ "Destination Schema: "+taskStatus.getSchema_name()
						+"</br> </br> ";					
						
			}
			
			body="The feed for "+tasksList.get(0).getSchema_name()+" from "+sourceName+" to "+targetName+" failed."
					+"</br> </br> "
					+body
					+ "</br> </br> " + "Please contact your Salesforce Engineering team for support.";

			processEmail(subject,body);	

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsending()", e);
			throw new TaskStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForTask()");
	}
	public void mailsendingForTaskFailure(String object,List<LogHistory> finalList)
			throws TaskStatusServiceException {
		log.info("==>MailService.mailsendingForTaskFailure()");
		String subject = "";
		String body = "";
		try {

			if (object.equalsIgnoreCase("PRODUCT")) {
				subject = email.getEnv() + " JOB FAILURES: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Products";
			} else if (object.equalsIgnoreCase("ORDER")) {
				subject = email.getEnv() + " JOB FAILURES: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Orders";
			} else if (object.equalsIgnoreCase("CUSTOMER")) {
				subject = email.getEnv() + " JOB FAILURES: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Customers";
			}
			StringBuilder emails = new StringBuilder();
			emails.append(
					"<html><style>table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;text-align: left;}</style><body>"
							+ "<table style='border:2px solid black'>");

			emails.append("<tr>");
			emails.append("<th>");
			emails.append("Schema");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Log Table");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Error Message");
			emails.append("</th>");
			
			if(object.equalsIgnoreCase("PRODUCT")) {
				emails.append("<th>");
				emails.append("Product ID");
				emails.append("</th>");
			}else if(object.equalsIgnoreCase("ORDER")) {
				emails.append("<th>");
				emails.append("Alt Order ID");
				emails.append("</th>");
			}else {
				emails.append("<th>");
				emails.append("Customer ID");
				emails.append("</th>");
			}
			

			emails.append("<th>");
			emails.append("Timestamp of First Error");
			emails.append("</th>");
			emails.append("</tr>");

			for (LogHistory item : finalList) {

				System.out.println("in results...");
				emails.append("<tr>");

				emails.append("<td>");
				emails.append(item.getSnowflakeSchema());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getTableName());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getErrorMessage());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(item.getId());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getErrorDate());
				emails.append("</td>");

				emails.append("</tr>");
			}

			emails.append("</table></body></html>");
			body = body + emails.toString();

			body = "The feed to consolidate " + finalList.get(0).getPlatform() + " store data in Snowflake failed."
					+ "</br> </br> " + body + "</br> </br> "
					+ "Please contact your Salesforce Engineering team for support.";

			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForTaskFailure()", e);
			throw new TaskStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForTaskFailure()");
	}
	
	public void mailsendingForAutoDataChecks(String object,List<AutoDataChecks> finalList)
			throws AutodataCheckServiceException {
		log.info("==>MailService.mailsendingForAutoDataChecks()");
		String subject = "";
		String body = "";
		try {

			if (object.equalsIgnoreCase("PRODUCT")) {
				subject = email.getEnv() + " Data Mismatch: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Products";
			} else if (object.equalsIgnoreCase("ORDER")) {
				subject = email.getEnv() + " Data Mismatch: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Orders";
			} else if (object.equalsIgnoreCase("CUSTOMER")) {
				subject = email.getEnv() + " Data Mismatch: " + finalList.get(0).getPlatform()
						+ " All Stores - Consolidation - Customers";
			}
								
			StringBuilder emails = new StringBuilder();
			emails.append(
					"<html><style>table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;text-align: left;}</style><body>"
							+ "<table style='border:2px solid black'>");

			emails.append("<tr>");
			emails.append("<th>");
			emails.append("Schema");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Log Table");
			emails.append("</th>");

			
			
			if(object.equalsIgnoreCase("PRODUCT")) {
				emails.append("<th>");
				emails.append("Product ID");
				emails.append("</th>");
			}else if(object.equalsIgnoreCase("ORDER")) {
				emails.append("<th>");
				emails.append("Alt Order ID");
				emails.append("</th>");
			}else {
				emails.append("<th>");
				emails.append("Customer ID");
				emails.append("</th>");
			}
			
			emails.append("<th>");
			emails.append("Number Of Errors");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Date Of Last Error");
			emails.append("</th>");
			emails.append("</tr>");

			for (AutoDataChecks item : finalList) {

				System.out.println("in results...");
				emails.append("<tr>");

				emails.append("<td>");
				emails.append(item.getSnowflakeSchema());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getTableName());
				emails.append("</td>");

				
				
				emails.append("<td>");
				emails.append(item.getItemId());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(item.getCount());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getErrorDate());
				emails.append("</td>");

				emails.append("</tr>");
			}

			emails.append("</table></body></html>");
			body = body + emails.toString();
			
			/*
			 * body = body + "There are data mismatches when comparing " +
			 * finalList.get(0).getPlatform() + " source data with the "
			 * +finalList.get(0).getPlatform()+ " consolidated data in Snowflake:";
			 */

			
			body = "There are data mismatches when comparing " + finalList.get(0).getPlatform() + " source data with the "
					+finalList.get(0).getPlatform()+ " consolidated data in Snowflake:"
					+ "</br> </br> " + body + "</br> </br> "
					+ "Please contact your Salesforce Engineering team for support.";

			//body =body+"Please contact your Salesforce Engineering team for support.";

			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForTaskFailure()", e);
			throw new AutodataCheckServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForTaskFailure()");
	}
	
	public void mailsendingForDeleteRequestReport(List<DeleteRequest> finalList,Date jobStartDate)
			throws DeleteRequestServiceException {
		log.info("==>MailService.mailsendingForDeleteRequestReport()");
		String subject = "";
		String body = "";
		try {
			Date jobEndDate = new Date();
			SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
			String jobEndTime = format.format(jobEndDate.getTime());
			long millis = jobEndDate.getTime() - jobStartDate.getTime();
			String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
					TimeUnit.MILLISECONDS.toMinutes(millis)
							- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
					TimeUnit.MILLISECONDS.toSeconds(millis)
							- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
		
				subject = email.getEnv() + " PROCESSED DELETE RECORDS - SNOWFLAKE DELETE REQUESTS - ALL " + finalList.get(0).getPlatform().toUpperCase()
						+ " STORES";
			

				
				
			StringBuilder emails = new StringBuilder();
			emails.append(
					"<html><style>table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;text-align: left;}</style><body>"
							+ "<table style='border:2px solid black'>");

			emails.append("<tr>");
			emails.append("<th>");
			emails.append("Process Run Date/Time");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Store ID");
			emails.append("</th>");
			
			emails.append("<th>");
			emails.append("Schema");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("Customer Rows Processed");
			emails.append("</th>");
			
			/*
			 * emails.append("<th>"); emails.append("Customer Lookup Rows Processed");
			 * emails.append("</th>");
			 */
			
			emails.append("<th>");
			emails.append("Order Rows Processed");
			emails.append("</th>");
			emails.append("</tr>");

			for (DeleteRequest item : finalList) {

				System.out.println("in results...");
				emails.append("<tr>");

				emails.append("<td>");
				emails.append(item.getProcessRunTime());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getStoreId());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(item.getSnowflakeSchema());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(item.getCustomerRowsProcessed());
				emails.append("</td>");

				/*
				 * emails.append("<td>"); emails.append(item.getCustomerLKPRowsProcessed());
				 * emails.append("</td>");
				 */
				
				emails.append("<td>");
				emails.append(item.getOrderRowsProcessed());
				emails.append("</td>");

				emails.append("</tr>");
			}

			emails.append("</table></body></html>");
			body = body + emails.toString();
			
			body="The Snowflake Delete Requests process ran and completed at: "+jobEndTime
					+".</br></br>Run Time: "+hms+"."
					+ "</br> </br> " + body + "</br> </br> ";
			

			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForDeleteRequestReport()", e);
			throw new DeleteRequestServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForDeleteRequestReport()");
	}
	
	public void mailsendingForDeleteRequestFailure(List<DeleteRequestLog> finalList)
			throws DeleteRequestServiceException {
		log.info("==>MailService.mailsendingForDeleteRequestFailure()");
		String subject = "";
		String body = "";
		try {
	
			subject = email.getEnv() + " FAILED DELETE RECORDS - SNOWFLAKE DELETE REQUESTS " ;
		
			
			for(DeleteRequestLog item:finalList) {
				body="The Snowflake Delete Requests process ran and completed but with failed records."+"</br> </br> " 
						+"Error Date: "+item.getErrorDate()
						+".</br>Error Message: "+item.getErrorMsg()+"."
						+ "</br> </br> " 
						+"Please contact your Salesforce Engineering team for support.";
			}

			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForDeleteRequestReport()", e);
			throw new DeleteRequestServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForDeleteRequestReport()");
	}
	
	public void mailsendingForAllProcessFailure(List<TaskStatus> taskStatusList, String taskName)
			throws DeleteRequestServiceException {
		log.info("==>MailService.mailsendingForDeleteRequestProcessFailure()");
		String subject = "";
		String body = "";
		try {
		
				
		    	long millis =  Duration.between(taskStatusList.get(0).getQuery_start_time(),taskStatusList.get(0).getCompleted_time()).toMillis();
		    			 
				String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
	    	            TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
	    	            TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
				
				DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");

			    String formattedDate = taskStatusList.get(0).getCompleted_time().format(myFormatObj);
			    
			    if(taskName.equalsIgnoreCase("DELETE")) {
			    	subject = email.getEnv() + " JOB_FAILED - SNOWFLAKE DELETE REQUESTS " ;
					
					body = body+" The Snowflake Delete Requests process failed."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    }else if(taskName.equalsIgnoreCase("GLOBALDATA")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - GLOBAL STORES DATA TESTING" ;
			    	
			    	body = body+" The Global Data Testing process failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";	
			    	
			    }else if(taskName.equalsIgnoreCase("SHOPIFYPRODUCT")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SOURCE to CONSOLIDATED - PRODUCTS" ;
			    	
			    	body = body+" The Source to Consolidated Products feed failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }else if(taskName.equalsIgnoreCase("SHOPIFYCUSTOMER")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SOURCE to CONSOLIDATED - CUSTOMERS" ;
			    	
			    	body = body+" The Source to Consolidated Customers feed failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }else if(taskName.equalsIgnoreCase("SHOPIFYORDER")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SOURCE to CONSOLIDATED - ORDERS" ;
			    	
			    	body = body+" The Source to Consolidated Orders feed failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }else if(taskName.equalsIgnoreCase("SHOPIFYCUSTOMERTOTALSPENT")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SOURCE to CONSOLIDATED - CUSTOMER TOTAL_SPENT_ALL_STORES" ;
			    	
			    	body = body+" The Source to Consolidated Customer TOTAL_SPENT_ALL_STORES process failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }else if(taskName.equalsIgnoreCase("SHOPIFYTOTALQUANTITY")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SOURCE to CONSOLIDATED - CUSTOMER TOTAL_SPENT_ALL_STORES" ;
			    	
			    	body = body+" The Source to Consolidated Orders feed failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }else if(taskName.equalsIgnoreCase("RECONCILATION")) {
			    	
			    	subject = email.getEnv() + " JOB_FAILED - SHOPIFY  SOURCE-CONSOLIDATION RECONCILIATION COUNTS" ;
			    	
			    	body = body+" The Source to Consolidation Reconcilation counts process failed to complete."						
							+"</br> </br>Task Name: " + taskStatusList.get(0).getName()
							+ "</br> Run Time: "  + hms
							+ "</br> Failed Time: "  + formattedDate
							+ "</br> Error Message: "  + taskStatusList.get(0).getError_message()
							+ "</br> </br> " 
							+"Please contact your Salesforce Engineering team for support.";
			    	
			    }
			    					
						
			
			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForDeleteRequestProcessFailure()", e);
			throw new DeleteRequestServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForDeleteRequestProcessFailure()");
	}
	
	public void mailsendingForAllProcessSuccess(String taskName)
			throws DeleteRequestServiceException {
		log.info("==>MailService.mailsendingForAllProcessSuccess()");
		String subject = "";
		String body = "";
		try {
			
			Date jobEndDate = new Date();
			SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
			String jobEndTime = format.format(jobEndDate.getTime());
			
			if(taskName.equalsIgnoreCase("DELETE")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SNOWFLAKE DELETE REQUESTS " ;
				
				body=body+" The Snowflake Delete Requests process ran successfully, completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("GLOBALDATA")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - GLOBAL STORES DATA TESTING " ;
				
				body=body+" The Ecommerce Global Data Testing process completed at: "+jobEndTime
						+ "</br> </br> ";							
				
				
			}else if(taskName.equalsIgnoreCase("RECONCILATION")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SHOPIFY  SOURCE-CONSOLIDATION RECONCILIATION COUNTS " ;
				
				body=body+" The Ecommerce Snowflake Shopify Reconciliation process completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("SHOPIFYPRODUCT")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SOURCE to CONSOLIDATED - PRODUCTS " ;
				
				body=body+" The Source to Consolidated Products feed completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("SHOPIFYCUSTOMER")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SOURCE to CONSOLIDATED - CUSTOMERS " ;
				
				body=body+" The Source to Consolidated Customers feed completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("SHOPIFYORDER")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SOURCE to CONSOLIDATED - ORDERS " ;
				
				body=body+" The Source to Consolidated Orders feed completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("SHOPIFYCUSTOMERTOTALSPENT")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SOURCE to CONSOLIDATED - TOTAL_SPENT_ALL_STORES " ;
				
				body=body+" The Source to Consolidated Customer TOTAL_SPENT_ALL_STORES process completed at: "+jobEndTime
						+ "</br> </br> ";
				
			}else if(taskName.equalsIgnoreCase("SHOPIFYTOTALQUANTITY")) {
				
				subject = email.getEnv() + " JOB_COMPLETED - SOURCE to CONSOLIDATED - ORDER TOTAL_QUANTITY " ;
				
				body=body+" The Source to Consolidated Order TOTAL_QUANTITY process completed at: "+jobEndTime
						+ "</br> </br> ";
			}
			
										
			
			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForAllProcessSuccess()", e);
			throw new DeleteRequestServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForAllProcessSuccess()");
	}
	
	/*
	 * public void mailsendingForGlobalDataProcessFailure(List<TaskStatus>
	 * taskStatusList) throws AutodataCheckServiceException {
	 * log.info("==>MailService.mailsendingForGlobalDataProcessFailure()"); String
	 * subject = ""; String body = ""; try {
	 * 
	 * subject = email.getEnv() + " JOB_FAILED - GLOBAL DATA TESTING " ;
	 * 
	 * 
	 * long millis =
	 * Duration.between(taskStatusList.get(0).getQuery_start_time(),taskStatusList.
	 * get(0).getCompleted_time()).toMillis();
	 * 
	 * String hms = String.format("%02d:%02d:%02d",
	 * TimeUnit.MILLISECONDS.toHours(millis),
	 * TimeUnit.MILLISECONDS.toMinutes(millis) -
	 * TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
	 * TimeUnit.MILLISECONDS.toSeconds(millis) -
	 * TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
	 * 
	 * DateTimeFormatter myFormatObj =
	 * DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
	 * 
	 * String formattedDate =
	 * taskStatusList.get(0).getCompleted_time().format(myFormatObj);
	 * 
	 * body = body+" The Global Data Testing process failed to complete."
	 * +"</br> </br>Task Name: " + taskStatusList.get(0).getName() +
	 * "</br> Run Time: " + hms + "</br> Failed Time: " + formattedDate +
	 * "</br> Error Message: " + taskStatusList.get(0).getError_message() +
	 * "</br> </br> "
	 * +"Please contact your Salesforce Engineering team for support.";
	 * 
	 * 
	 * processEmail(subject, body);
	 * 
	 * } catch (Exception e) { log.
	 * error("==>Exception at MailService.mailsendingForGlobalDataProcessFailure()",
	 * e); throw new AutodataCheckServiceException(e.getMessage(), e.getCause(),
	 * null); } log.info("<==MailService.mailsendingForGlobalDataProcessFailure()");
	 * }
	 */
	
	/*
	 * public void mailsendingForGlobalDataProcessSuccess() throws
	 * AutodataCheckServiceException {
	 * log.info("==>MailService.mailsendingForGlobalDataProcessSuccess()"); String
	 * subject = ""; String body = ""; try {
	 * 
	 * subject = email.getEnv() + " JOB_COMPLETED - GLOBAL DATA TESTING " ;
	 * 
	 * 
	 * Date jobEndDate = new Date(); SimpleDateFormat format = new
	 * SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); String jobEndTime =
	 * format.format(jobEndDate.getTime());
	 * 
	 * body=body+" The Ecommerce Global Data Testing process completed at: "
	 * +jobEndTime + "</br> </br> ";
	 * 
	 * processEmail(subject, body);
	 * 
	 * } catch (Exception e) { log.
	 * error("==>Exception at MailService.mailsendingForGlobalDataProcessSuccess()",
	 * e); throw new AutodataCheckServiceException(e.getMessage(), e.getCause(),
	 * null); } log.info("<==MailService.mailsendingForGlobalDataProcessSuccess()");
	 * }
	 */
	
	/*
	 * public void mailsendingForReconcilationProcessSuccess() throws
	 * RowStatusServiceException {
	 * log.info("==>MailService.mailsendingForReconcilationProcessSuccess()");
	 * String subject = ""; String body = ""; try {
	 * 
	 * subject = email.getEnv() +
	 * " JOB_COMPLETED - SHOPIFY  SOURCE-CONSOLIDATION RECONCILIATION COUNTS " ;
	 * 
	 * 
	 * Date jobEndDate = new Date(); SimpleDateFormat format = new
	 * SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); String jobEndTime =
	 * format.format(jobEndDate.getTime());
	 * 
	 * body=
	 * body+" The Ecommerce Snowflake Shopify Reconciliation process completed at: "
	 * +jobEndTime + "</br> </br> ";
	 * 
	 * processEmail(subject, body);
	 * 
	 * } catch (Exception e) { log.
	 * error("==>Exception at MailService.mailsendingForReconcilationProcessSuccess()"
	 * , e); throw new RowStatusServiceException(e.getMessage(), e.getCause(),
	 * null); }
	 * log.info("<==MailService.mailsendingForReconcilationProcessSuccess()"); }
	 */
	
	/*
	 * public void mailsendingForShopifyDataFeedingProcess() throws
	 * TaskStatusServiceException {
	 * log.info("==>MailService.mailsendingForShopifyDataFeedingProcess()"); String
	 * subject = ""; String body = ""; try {
	 * 
	 * subject = email.getEnv() +
	 * " JOB_COMPLETED - ECOMMERCE SNOWFLAKE CONSOLIDATION - MASTER PROC " ;
	 * 
	 * 
	 * Date jobEndDate = new Date(); SimpleDateFormat format = new
	 * SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); String jobEndTime =
	 * format.format(jobEndDate.getTime());
	 * 
	 * body=body+" The Ecommerce Snowflake Consolidation Master Proc completed at: "
	 * +jobEndTime + "</br> </br> ";
	 * 
	 * processEmail(subject, body);
	 * 
	 * } catch (Exception e) { log.
	 * error("==>Exception at MailService.mailsendingForShopifyDataFeedingProcess()"
	 * , e); throw new TaskStatusServiceException(e.getMessage(), e.getCause(),
	 * null); }
	 * log.info("<==MailService.mailsendingForShopifyDataFeedingProcess()"); }
	 */
	
	public void mailsendingForLogShopifyDataHistory(List<LogHistory> finalList)
			throws TaskStatusServiceException {
		log.info("==>MailService.mailsendingForLogShopifyDataHistory()");
		String subject = "";
		String body = "";
		try {

		
				subject = email.getEnv() + " JOB FAILURE - ECOMMERCE SNOWFLAKE CONSOLIDATION - MASTER PROC ";
			
			StringBuilder emails = new StringBuilder();
			emails.append(
					"<html><style>table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;text-align: left;}</style><body>"
							+ "<table style='border:2px solid black'>");

			emails.append("<tr>");
			emails.append("<th>");
			emails.append("ERROR_DATE");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("SUB_PROCEDURE_NAME");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("SUB_PROCEDURE_ERROR");
			emails.append("</th>");
			

			emails.append("<th>");
			emails.append("ERROR_MESSAGE");
			emails.append("</th>");
			emails.append("</tr>");

			for (LogHistory item : finalList) {

				//System.out.println("in results...");
				emails.append("<tr>");

				emails.append("<td>");
				emails.append(item.getErrorDate());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getStoredProcedureName());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(item.getCustomErrorMsg());
				emails.append("</td>");
				

				emails.append("<td>");
				emails.append(item.getErrorMessage());
				emails.append("</td>");

				emails.append("</tr>");
			}

			emails.append("</table></body></html>");
			body = body + emails.toString();

			body = "The master stored procedure which runs all of the sub-stored procedures for Ecommerce Consolidation has failed with the following errors: "
					+ "</br> </br> " + body + "</br> </br> "
					+ "Please contact your Salesforce Engineering team for support.";

			processEmail(subject, body);

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsendingForLogShopifyDataHistory()", e);
			throw new TaskStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsendingForLogShopifyDataHistory()");
	}
	
	
	
	public void mailsendingForRowCountStatus(String object, List<RowCountStatus> rowStatusList)
			throws PipeStatusServiceException {
		log.info("==>MailService.mailsendingForRowCountStatus()");
		
		try {
			String body = "";
			String subject="";
			String tableName=null;
			if(object.equalsIgnoreCase("PRODUCT")) {
				subject=email.getEnv()+"WARNING - SOURCE-CONSOLIDATION ROW COUNT DIFFERENCES – PRODUCT";
			}else if(object.equalsIgnoreCase("CUSTOMER")) {
				subject=email.getEnv()+"WARNING - SOURCE-CONSOLIDATION ROW COUNT DIFFERENCES – CUSTOMERS";
				
			}else if(object.equalsIgnoreCase("ORDER")) {
				subject=email.getEnv()+"WARNING - SOURCE-CONSOLIDATION ROW COUNT DIFFERENCES – ORDER";
			}
					
			StringBuilder emails = new StringBuilder();
			emails.append(
					"<html><style>table, th, td {border: 1px solid black;border-collapse: collapse;}th, td {padding: 5px;text-align: left;}</style><body>"
							+ "<table style='border:2px solid black'>");

			emails.append("<tr>");
			emails.append("<th>");
			emails.append("PROCESS DATE");
			emails.append("</th>");
			
			emails.append("<th>");
			emails.append("STORE_ID");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("SHOPIFY_SCHEMA");
			emails.append("</th>");
			
			emails.append("<th>");
			emails.append("SOURCE COUNT FINAL");
			emails.append("</th>");
			
			emails.append("<th>");
			emails.append("CONSOLIDATION COUNT FINAL");
			emails.append("</th>");

			emails.append("<th>");
			emails.append("DIFFERENCE");
			emails.append("</th>");
			emails.append("</tr>");
			
			for (RowCountStatus rowStatus : rowStatusList) {				
				
				
				emails.append("<tr>");
				
				emails.append("<td>");
				emails.append(rowStatus.getProcessDate());
				emails.append("</td>");

				emails.append("<td>");
				emails.append(rowStatus.getStoreID());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(rowStatus.getSchemaName());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(rowStatus.getSourcecFinalCount());
				emails.append("</td>");
				
				
				emails.append("<td>");
				emails.append(rowStatus.getConsolidationFinalCount());
				emails.append("</td>");
				
				emails.append("<td>");
				emails.append(rowStatus.getDifference());
				emails.append("</td>");
				
				emails.append("</tr>");
				
				/*
				 * body = body + "</br>" + rowStatus.getErrorMessage() +"</br> ";
				 */
			}
			emails.append("</table></body></html>");
			
			body =  "The Snowflake Souce vs Consolidation reconciliation process found differences in "+object+" row counts within the following stores:"
					+"</br></br>"
					+emails.toString()
					+ "</br></br>" + "Please contact your Snowflake Engineering team for support.";

			processEmail(subject,body);			

		} catch (Exception e) {
			log.error("==>Exception at MailService.mailsending()", e);
			throw new PipeStatusServiceException(e.getMessage(), e.getCause(), null);
		}
		log.info("<==MailService.mailsending()");
	}


}
