/**
 ********************************************************************************
 * Copyright (c) 2020 Eclipse APP4MC contributors.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 ********************************************************************************
 */

package org.eclipse.app4mc.amalthea._import.btf;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.eclipse.app4mc.amalthea._import.btf.model.BTFCombiState;
import org.eclipse.app4mc.amalthea._import.btf.model.BTFCountMetric;
import org.eclipse.app4mc.amalthea._import.btf.model.BTFEntityState;
import org.eclipse.app4mc.amalthea._import.btf.model.BTFEntityType;
import org.eclipse.app4mc.amalthea._import.btf.model.BTFInterInstanceMetric;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;

public class ATDBMetricCalculator implements IRunnableWithProgress {
	
	private final Connection con;
	
	public ATDBMetricCalculator(final Connection con) {
		this.con = con;
	}

	@Override
	public void run(IProgressMonitor monitor) throws InvocationTargetException {
		monitor.beginTask("Calculating metrics...", 100);
		try (final PreparedStatement metricStmt = this.con.prepareStatement("INSERT INTO metric(name, dimension) VALUES(?, ?);");
				final Statement statement = this.con.createStatement()) {
			final Set<String> entityInstanceTimeMetrics = new LinkedHashSet<>();
	
			// for each state: add a '[state]Time' metric signifying how long the entity instance was in that state
			for (final BTFEntityState state : BTFEntityState.actStates) {
				entityInstanceTimeMetrics.add(state + "Time");
				metricStmt.setString(1, state + "Time");
				metricStmt.setString(2, "time");
				metricStmt.addBatch();
				final List<String> entityInstanceStateTimesQuerys = new ArrayList<>();
				state.entityType2InOutEvents.forEach((entityType, inOut) -> {
					// map and collect events as SQL list
					final String incomingEvents = inOut.getKey().stream().map(e -> "'" + e.getName().toLowerCase() + "'").collect(Collectors.joining(", "));
					// map and collect events as SQL list
					final String outgoingEvents = inOut.getValue().stream().map(e -> "'" + e.getName().toLowerCase() + "'").collect(Collectors.joining(", "));
					final String query = "SELECT"//
							+ "  entityId,"//
							+ "  entityInstance,"//
							+ "  IFNULL(SUM(CASE"//
							+ "    WHEN eventTypeId IN (SELECT id FROM eventType WHERE name IN (" + incomingEvents + ")) THEN -timestamp"//
							+ "    WHEN eventTypeId IN (SELECT id FROM eventType WHERE name IN (" + outgoingEvents + ")) THEN timestamp"//
							+ "  END), 0) " + state + "Time "//
							+ "FROM " + entityType.getName() + "InstanceRuntimeTraceEvent GROUP BY entityId, entityInstance "//
							+ "HAVING (SELECT isComplete FROM " + entityType.getName() + "InstanceTraceInfo WHERE "//
							+ "  entityId       = " + entityType.getName() + "InstanceRuntimeTraceEvent.entityId AND "//
							+ "  entityInstance = " + entityType.getName() + "InstanceRuntimeTraceEvent.entityInstance)";
					entityInstanceStateTimesQuerys.add(query);
				});
				final String entityInstanceMetricQuery = "INSERT INTO entityInstanceMetricValue SELECT "//
						+ "  entityId,"//
						+ "  entityInstance,"//
						+ "  (SELECT id FROM metric WHERE name = '" + state + "Time'),"//
						+ "  " + state + "Time FROM (" + String.join(" UNION ", entityInstanceStateTimesQuerys)//
						+ ");";
				statement.addBatch(entityInstanceMetricQuery);
			}
	
			// consider combi states for processes
			for (final BTFCombiState cState : BTFCombiState.values()) {
				entityInstanceTimeMetrics.add(cState + "Time");
				metricStmt.setString(1, cState + "Time");
				metricStmt.setString(2, "time");
				metricStmt.addBatch();
				final String stateTimes = cState.getStates().stream().map(s -> "'" + s + "Time'").collect(Collectors.joining(", "));
				final String query = "INSERT INTO entityInstanceMetricValue SELECT\n"
						+ "  entityId,\n"
						+ "  entityInstance,\n"
						+ "  (SELECT id FROM metric WHERE name = '" + cState + "Time'),\n"
						+ "  value\n"
						+ "FROM entityInstanceMetricValue WHERE\n"
						+ "  metricId IN (SELECT id FROM metric WHERE name IN (" + stateTimes + ")) AND\n"
						+ "  (SELECT isComplete\n"
						+ "    FROM " + BTFEntityType.processsss.getName() + "InstanceTraceInfo\n"
						+ "    WHERE entityId = entityInstanceMetricValue.entityId AND\n"
						+ "      entityInstance = entityInstanceMetricValue.entityInstance\n"
						+ "  ) = 1\n"
						+ "GROUP BY entityId, entityInstance;";
				statement.addBatch(query);
			}
	
			// calculate inter-instance metrics
			for (final BTFInterInstanceMetric metric : BTFInterInstanceMetric.values()) {
				entityInstanceTimeMetrics.add(metric.toString());
				metricStmt.setString(1, metric.toString());
				metricStmt.setString(2, "time");
				metricStmt.addBatch();
				final List<String> iiMetricQueries = new ArrayList<>();
				metric.entityType2FirstAndSecond.forEach((entityType, firstAndSecondInstEvent) -> {
					final String query = "SELECT A.entityId, A.entityInstance, SUM(B.timestamp - A.timestamp) AS " + metric + " "//
							+ "FROM (SELECT * FROM " + entityType.getName() + "InstanceRuntimeTraceEvent) AS A "//
							+ "INNER JOIN " + entityType.getName() + "InstanceRuntimeTraceEvent AS B ON "//
							+ "  B.entityId = A.entityId AND B.entityInstance = A.entityInstance + 1 "//
							+ "  WHERE A.eventTypeId = (SELECT id FROM eventType WHERE name = '" + firstAndSecondInstEvent.getKey() + "') AND "//
							+ "        B.eventTypeId = (SELECT id FROM eventType WHERE name = '" + firstAndSecondInstEvent.getValue() + "') "//
							+ "  GROUP BY A.entityId, A.entityInstance "//
							+ "  HAVING (SELECT isComplete FROM " + entityType.getName() + "InstanceTraceInfo WHERE "//
							+ "      entityId       = A.entityId AND "//
							+ "      entityInstance = A.entityInstance) AND "//
							+ "    (SELECT isComplete FROM " + entityType.getName() + "InstanceTraceInfo WHERE "//
							+ "      entityId       = B.entityId AND "//
							+ "      entityInstance = B.entityInstance)";
					iiMetricQueries.add(query);
				});
				statement.addBatch("INSERT INTO entityInstanceMetricValue SELECT "//
						+ "  entityId,"//
						+ "  entityInstance,"//
						+ "  (SELECT id FROM metric WHERE name = '" + metric + "'),"//
						+ "  " + metric + " FROM (" + String.join(" UNION ", iiMetricQueries)//
						+ ");");
			}
	
			// calculate entity metrics min max avg for all time metric values
			final List<String> mma = Arrays.asList("Min", "Max", "Avg", "StDev");
			for (final String entityInstanceTimeMetric : entityInstanceTimeMetrics) {
				for (final String kind : mma) {
					metricStmt.setString(1, entityInstanceTimeMetric + "_" + kind);
					metricStmt.setString(2, "time");
					metricStmt.addBatch();
				}
			}
			for (final String kind : mma) {
				String aggregateFunction = kind.toUpperCase() + "(CAST(value AS INTEGER))";
				if (kind.equalsIgnoreCase("AVG") || kind.equalsIgnoreCase("STDEV")) {
					aggregateFunction = "printf('%.2f'," + aggregateFunction + ")";
				}
				statement.addBatch("INSERT INTO entityMetricValue SELECT "//
						+ "  entityId,"//
						+ "  (SELECT id FROM metric WHERE name = (SELECT name FROM metric WHERE id = metricId) || '_" + kind + "'),"//
						+ "  " + aggregateFunction + " FROM entityInstanceMetricValue WHERE "//
						+ "metricId IN (SELECT id FROM metric WHERE dimension = 'time') GROUP BY entityId, metricId;");
			}
	
			// insert entity specific count metrics
			for (final BTFCountMetric cm : BTFCountMetric.values()) {
				metricStmt.setString(1, cm.toString());
				metricStmt.setString(2, "count");
				metricStmt.addBatch();
				statement.addBatch("INSERT INTO entityMetricValue SELECT "//
						+ "  entityId,"//
						+ "  (SELECT id FROM metric WHERE name = '" + cm + "') AS metricId,"//
						+ "  SUM(" + cm.eventToCount.toString().toLowerCase() + "EventCount) AS value "//
						+ "FROM " + cm.entityType.getName() + "InstanceTraceInfo GROUP BY entityId;");
			}
	
			// execute all statements
			this.con.setAutoCommit(false);
			metricStmt.executeBatch();
			monitor.worked(70);
			statement.executeBatch();
			monitor.worked(30);
			this.con.setAutoCommit(true);
		} catch (SQLException e) {
			throw new InvocationTargetException(e);
		}
	}

}
