package com.realnet.Dashboard_builder.Controllers;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.realnet.SureConnect.Entities.Sure_Connect;
import com.realnet.SureConnect.Service.SureService;

import lombok.extern.slf4j.Slf4j;

@Slf4j

@RequestMapping("/chart")
@RestController
public class ChartBuilder {

	@Autowired
	private SureService sureService;

	public List<Map<String, Object>> getAllDataFromTable(String tableName) {
		List<Map<String, Object>> tableData = new ArrayList<>();

		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;

		try {
			// Establish a database connection
			connection = DriverManager.getConnection(
					"jdbc:mysql://realnet.cdtynkxfiu2h.ap-south-1.rds.amazonaws.com:3306/suresetu", "cnsdev",
					"cnsdev1234");

			// Create a SQL statement
			statement = connection.createStatement();

			// Execute the query to retrieve all data from the table
			String query = "SELECT * FROM " + tableName;
			resultSet = statement.executeQuery(query);

			// Retrieve the column names from the result set
			ResultSetMetaData metaData = resultSet.getMetaData();
			int columnCount = metaData.getColumnCount();
			List<String> columnNames = new ArrayList<>();
			for (int i = 1; i <= columnCount; i++) {
				columnNames.add(metaData.getColumnName(i));
			}

			// Iterate over the result set and store each row in a map
			while (resultSet.next()) {
				Map<String, Object> rowData = new HashMap<>();
				for (String columnName : columnNames) {
					Object value = resultSet.getObject(columnName);
					rowData.put(columnName, value);
				}
				tableData.add(rowData);
			}
		} catch (SQLException e) {
			log.error(e.getLocalizedMessage());
		} finally {
			// Close the resources
			if (resultSet != null) {
				try {
					resultSet.close();
				} catch (SQLException e) {
					log.error(e.getLocalizedMessage());
				}
			}
			if (statement != null) {
				try {
					statement.close();
				} catch (SQLException e) {
					log.error(e.getLocalizedMessage());
				}
			}
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					log.error(e.getLocalizedMessage());
				}
			}
		}

		return tableData;
	}

//...........................22.07.2023.............................//

//	@GetMapping(value = "/getdashjson/{job_type}")
//	public ResponseEntity<?> jsonretun(@RequestParam String tableName, @PathVariable String job_type,
//			@RequestParam String xAxis, @RequestParam String yAxis) throws IOException {
//
//		List<Map<String, Object>> tableData = getAllDataFromTable(tableName); // Retrieve all data from the table
//
//		List<Object> yAxisValues = new ArrayList<>();
//		List<String> xAxisValues = new ArrayList<>();
//
//		for (Map<String, Object> row : tableData) {
//			for (Entry<String, Object> entry : row.entrySet()) {
//				String key = entry.getKey();
//				Object value = entry.getValue();
//
//				if (key.equalsIgnoreCase(xAxis)) {
//					xAxisValues.add(value.toString());
//				} else if (key.equalsIgnoreCase(yAxis)) {
//					yAxisValues.add(value);
//				}
//			}
//		}
//
//		StringBuilder jsonmap = new StringBuilder();
//
//		if (job_type.equalsIgnoreCase("Bar Chart")) {
//			jsonmap.append("[\n");
//		} else if (job_type.equalsIgnoreCase("Line Chart")) {
//			jsonmap.append("  {\r\n" + "   \"chartData\": [\r\n" + "    { \"data\": [");
//		} else if (job_type.equalsIgnoreCase("Doughnut Chart")) {
//			jsonmap.append("{\"chartData\": [[");
//		}
//
//		for (int i = 0; i < xAxisValues.size(); i++) {
//			String xValue = xAxisValues.get(i);
//			Object yValue = yAxisValues.get(i);
//
//			if (job_type.equalsIgnoreCase("Bar Chart")) {
//				jsonmap.append("{\"name\": \"" + xValue + "\", \"progress\":\"" + yValue + "\"},\n");
//			} else if (job_type.equalsIgnoreCase("Line Chart")) {
//				jsonmap.append(yValue + ",");
//			} else if (job_type.equalsIgnoreCase("Doughnut Chart")) {
//				jsonmap.append(yValue + ",");
//			}
//		}
//
//		if (!xAxisValues.isEmpty() && !yAxisValues.isEmpty()) {
//			jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//		}
//
//		if (job_type.equalsIgnoreCase("Bar Chart")) {
//			jsonmap.append("]");
//		} else if (job_type.equalsIgnoreCase("Line Chart")) {
//			jsonmap.append("], \"label\": \"" + yAxis + "\" }\r\n" + "   ],\r\n" + "   \"chartLabels\": [ ");
//		} else if (job_type.equalsIgnoreCase("Doughnut Chart")) {
//			jsonmap.append("]],\r\n" + " \"chartLabels\": [");
//		}
//
//		for (String xValue : xAxisValues) {
//			jsonmap.append("\"" + xValue + "\",");
//		}
//
//		if (!xAxisValues.isEmpty()) {
//			jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//		}
//
//		if (job_type.equalsIgnoreCase("Line Chart")) {
//			jsonmap.append("] \n }\n");
//		} else if (job_type.equalsIgnoreCase("Doughnut Chart")) {
//			jsonmap.append("]\n" + "}");
//		}
//
//		return new ResponseEntity<>(jsonmap.toString(), HttpStatus.CREATED);
//	}

	@GetMapping(value = "/getdashjson/{job_type}")
	public ResponseEntity<?> jsonretun2(@PathVariable String job_type, @RequestParam String tableName,
			@RequestParam(required = false) String xAxis, @RequestParam(required = false) List<String> yAxes,
			@RequestParam Integer sureId, @RequestParam(required = false) String parameter,
			@RequestParam(required = false) String parameterValue) throws IOException {

		StringBuilder jsonmap = new StringBuilder();

		if (job_type.equalsIgnoreCase("Grid")) {
			List<Map<String, Object>> allData = getAllDataFromApi(tableName, sureId);

			jsonmap.append("[\n");

			for (Map<String, Object> row : allData) {
				jsonmap.append("{\n");

				int colCount = 0;
				for (String yAxis : yAxes) {
					String key = yAxis;
					Object value = row.get(key);

					jsonmap.append("\"" + key + "\": \"" + value + "\"");

					colCount++;
					if (colCount < yAxes.size()) {
						jsonmap.append(", ");
					}
					jsonmap.append("\n");
				}

				jsonmap.append("}");

				if (!row.equals(allData.get(allData.size() - 1))) {
					jsonmap.append(", ");
				}
			}

			jsonmap.append("\n]\n");

			return new ResponseEntity<>(jsonmap.toString(), HttpStatus.CREATED);
		}

		if (job_type.equalsIgnoreCase("Todo List") && yAxes != null && !yAxes.isEmpty()) {
			List<Map<String, Object>> allData = getAllDataFromApi(tableName, sureId);

			String listName = yAxes.get(0); // Assuming the first column in yAxes to be the list name
			List<Object> listData = new ArrayList<>();

			for (Map<String, Object> row : allData) {
				Object value = row.get(listName);

				if (value != null) {
					listData.add(value);
				}
			}

			Map<String, Object> response = new HashMap<>();
			response.put("listName", listName);
			response.put("List", listData);

			return new ResponseEntity<>(response, HttpStatus.CREATED);
		}

		List<Map<String, Object>> tableData = getAllDataFromApi(tableName, sureId); // Retrieve all data from the table
		// ✅ Filter table data if parameter and parameterValue are provided
		if (parameter != null && !parameter.trim().isEmpty() && parameterValue != null
				&& !parameterValue.trim().isEmpty()) {

			tableData = tableData.stream().filter(row -> {
				Object paramVal = row.get(parameter);
				return paramVal != null && paramVal.toString().equalsIgnoreCase(parameterValue);
			}).collect(Collectors.toList());
		}
		List<List<Object>> yAxisValuesList = new ArrayList<>();
		List<String> xAxisValues = new ArrayList<>();
		List<String> parameterValues = new ArrayList<>();

		// Initialize a list for each y-axis parameter
		for (int i = 0; i < yAxes.size(); i++) {
			yAxisValuesList.add(new ArrayList<>());
		}

		for (Map<String, Object> row : tableData) {
			for (Entry<String, Object> entry : row.entrySet()) {
				String key = entry.getKey();
				Object value = entry.getValue();

				if (value != null && key.equalsIgnoreCase(xAxis)) {
					xAxisValues.add(value.toString());
				} else {
					int yIndex = yAxes.indexOf(key);
					if (yIndex >= 0) {
						yAxisValuesList.get(yIndex).add(value);
					}
				}

			}
		}

		jsonmap = getJson(jsonmap, yAxes, xAxisValues, yAxisValuesList, parameterValues);

//		if (job_type.equalsIgnoreCase("Bar Chart") || job_type.equalsIgnoreCase("Bar")) {
//			jsonmap.append("{\n \"barChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
////					Object yValue = yAxisValuesList.get(j).get(i);
//
//					List<Object> list = yAxisValuesList.get(j);
//					if (list.isEmpty()) {
//						continue;
//
//					}
//					Object yValue = list.get(i);
//					// ✅ Accept Integer, Long, Double, Float, or numeric Strings
//					if (yValue instanceof Number) {
//						jsonmap.append(yValue);
//					} else if (yValue instanceof String) {
//						String yStr = ((String) yValue).trim();
//						try {
//							// Parse and append only if numeric
//							Double num = Double.parseDouble(yStr);
//							jsonmap.append(num);
//						} catch (NumberFormatException e) {
//							// not numeric — skip
//							continue;
//						}
//					} else {
//						continue; // skip non-numeric values
//					}
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				// 🧹 Remove trailing comma if any
//				int lastIndex = jsonmap.lastIndexOf(",");
//				if (lastIndex == jsonmap.length() - 1) {
//					jsonmap.deleteCharAt(lastIndex);
//				}
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"barChartLabels\": [ ");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		}
//
//		else if (job_type.equalsIgnoreCase("Line Chart") || job_type.equalsIgnoreCase("Line")) {
//			jsonmap.append("{\n \"chartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					List<Object> list = yAxisValuesList.get(j);
//					if (list.isEmpty()) {
//						continue;
//
//					}
//					Object yValue = list.get(i);
//					// ✅ Accept Integer, Long, Double, Float, or numeric Strings
//					if (yValue instanceof Number) {
//						jsonmap.append(yValue);
//					} else if (yValue instanceof String) {
//						String yStr = ((String) yValue).trim();
//						try {
//							// Parse and append only if numeric
//							Double num = Double.parseDouble(yStr);
//							jsonmap.append(num);
//						} catch (NumberFormatException e) {
//							// not numeric — skip
//							continue;
//						}
//					} else {
//						continue; // skip non-numeric values
//					}
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				// 🧹 Remove trailing comma if any
//				int lastIndex = jsonmap.lastIndexOf(",");
//				if (lastIndex == jsonmap.length() - 1) {
//					jsonmap.deleteCharAt(lastIndex);
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"chartLabels\": [ ");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		} else if (job_type.equalsIgnoreCase("Doughnut Chart") || job_type.equalsIgnoreCase("Doughnut")) {
//			jsonmap.append("{\"chartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("[");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object yValue = yAxisValuesList.get(j).get(i);
//					jsonmap.append(yValue);
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("]");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"chartLabels\": [");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("]\n}");
//		}
//
//		else if (job_type.equalsIgnoreCase("Radar Chart") || job_type.equalsIgnoreCase("Radar")) {
//			jsonmap.append("{\n \"radarChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object yValue = yAxisValuesList.get(j).get(i);
//					jsonmap.append(yValue);
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"radarChartLabels\": [ ");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		}
//
//		else if (job_type.equalsIgnoreCase("PolarArea Chart") || job_type.equalsIgnoreCase("PolarArea")) {
//			jsonmap.append("{\n \"polarAreaChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object yValue = yAxisValuesList.get(j).get(i);
//					jsonmap.append(yValue);
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"polarAreaChartLabels\": [ ");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		}
//
//		if (job_type.equalsIgnoreCase("Pie Chart") || job_type.equalsIgnoreCase("Pie")) {
//			jsonmap.append("{\n \"pieChartData\": [");
//
//			for (int i = 0; i < yAxisValuesList.get(0).size(); i++) { // Assuming "mark" is the first item in yAxes
//				jsonmap.append(yAxisValuesList.get(0).get(i)); // Use the y-axis values
//
//				if (i < yAxisValuesList.get(0).size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"pieChartLabels\": [ ");
//
//			for (int i = 0; i < xAxisValues.size(); i++) { // Assuming "name" is the x-axis
//				jsonmap.append("\"" + xAxisValues.get(i) + "\""); // Use the x-axis values
//
//				if (i < xAxisValues.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("] \n }\n");
//		}
//
//		else if (job_type.equalsIgnoreCase("Bubble Chart") || job_type.equalsIgnoreCase("Bubble")) {
//			jsonmap.append("{\n \"bubbleChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object xValue = xAxisValues.get(i);
//					Object yValue = yAxisValuesList.get(j).get(i);
//					int radius = 5 + (i % 3) * 3; // Adjust the radius as needed
//
//					jsonmap.append("{ \"x\": " + xValue + ", \"y\": " + yValue + ", \"r\": " + radius + "}");
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"bubbleChartLabels\": [ ");
//
//			for (String label : xAxisValues) {
//				jsonmap.append("\"" + label + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		} else if (job_type.equalsIgnoreCase("Scatter Chart") || job_type.equalsIgnoreCase("Scatter")) {
//			jsonmap.append("{\n \"scatterChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object xValue = xAxisValues.get(i);
//					Object yValue = yAxisValuesList.get(j).get(i);
//
//					jsonmap.append("{ \"x\": " + xValue + ", \"y\": " + yValue + "}");
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"scatterChartLabels\": [ ");
//
//			for (String label : xAxisValues) {
//				jsonmap.append("\"" + label + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		}
//
//		else if (job_type.equalsIgnoreCase("Dynamic Chart") || job_type.equalsIgnoreCase("Dynamic")) {
//			jsonmap.append("{\n \"dynamicChartData\": [\n");
//
//			for (int j = 0; j < yAxes.size(); j++) {
//				String yAxis = yAxes.get(j);
//
//				jsonmap.append("{");
//				jsonmap.append("\"data\": [");
//
//				for (int i = 0; i < xAxisValues.size(); i++) {
//					Object yValue = yAxisValuesList.get(j).get(i);
//					jsonmap.append(yValue);
//
//					if (i < xAxisValues.size() - 1) {
//						jsonmap.append(",");
//					}
//				}
//
//				jsonmap.append("],");
//				jsonmap.append("\"label\": \"" + yAxis + "\"");
//				jsonmap.append("}");
//
//				if (j < yAxes.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			jsonmap.append("],\n \"dynamicChartLabels\": [ ");
//
//			for (String xValue : xAxisValues) {
//				jsonmap.append("\"" + xValue + "\",");
//			}
//
//			if (!xAxisValues.isEmpty()) {
//				jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//			}
//
//			jsonmap.append("] \n }\n");
//		}

		return new ResponseEntity<>(jsonmap.toString(), HttpStatus.CREATED);
	}

	public StringBuilder getJson(StringBuilder jsonmap, List<String> yAxes, List<String> xAxisValues,
			List<List<Object>> yAxisValuesList, List<String> parameterValues) {

		jsonmap.append("{\n \"chartData\": [\n");

		for (int j = 0; j < yAxes.size(); j++) {
			String yAxis = yAxes.get(j);

			jsonmap.append("{");
			jsonmap.append("\"data\": [");

			// --- Y-Axis Data ---
			for (int i = 0; i < xAxisValues.size(); i++) {
				List<Object> list = yAxisValuesList.get(j);
				if (list == null || list.isEmpty() || i >= list.size()) {
					continue;
				}

				Object yValue = list.get(i);
				if (yValue instanceof Number) {
					jsonmap.append(yValue);
				} else if (yValue instanceof String) {
					String yStr = ((String) yValue).trim();
					try {
						Double num = Double.parseDouble(yStr);
						jsonmap.append(num);
					} catch (NumberFormatException e) {
						continue; // skip non-numeric
					}
				} else {
					continue; // skip invalid
				}

				if (i < xAxisValues.size() - 1) {
					jsonmap.append(",");
				}
			}

			// 🧹 Remove trailing comma
			int lastIndex = jsonmap.lastIndexOf(",");
			if (lastIndex == jsonmap.length() - 1) {
				jsonmap.deleteCharAt(lastIndex);
			}

			jsonmap.append("],");
			jsonmap.append("\"label\": \"" + yAxis + "\"");
			jsonmap.append("}");

			if (j < yAxes.size() - 1) {
				jsonmap.append(",");
			}
		}

		// --- Chart Labels (X-Axis) ---
		jsonmap.append("],\n \"chartLabels\": [");
		for (String xValue : xAxisValues) {
			jsonmap.append("\"").append(xValue).append("\",");
		}

		if (!xAxisValues.isEmpty()) {
			jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
		}
		jsonmap.append("],");

		// --- Parameter Values ---
		jsonmap.append("\n \"parameterValues\": [");
		if (parameterValues != null && !parameterValues.isEmpty()) {
			for (String param : parameterValues) {
				if (param != null && !param.trim().isEmpty()) {
					jsonmap.append("\"").append(param.trim()).append("\",");
				}
			}
			// Remove trailing comma
			int lastComma = jsonmap.lastIndexOf(",");
			if (lastComma == jsonmap.length() - 1) {
				jsonmap.deleteCharAt(lastComma);
			}
		}
		jsonmap.append("]\n}");

		return jsonmap;
	}

//	get json data 
//	public StringBuilder getJson(StringBuilder jsonmap, List<String> yAxes, List<String> xAxisValues,
//			List<List<Object>> yAxisValuesList, List<String> parameterValues) {
//		jsonmap.append("{\n \"chartData\": [\n");
//
//		for (int j = 0; j < yAxes.size(); j++) {
//			String yAxis = yAxes.get(j);
//
//			jsonmap.append("{");
//			jsonmap.append("\"data\": [");
//
//			for (int i = 0; i < xAxisValues.size(); i++) {
//				List<Object> list = yAxisValuesList.get(j);
//				if (list.isEmpty()) {
//					continue;
//
//				}
//				Object yValue = list.get(i);
//				// ✅ Accept Integer, Long, Double, Float, or numeric Strings
//				if (yValue instanceof Number) {
//					jsonmap.append(yValue);
//				} else if (yValue instanceof String) {
//					String yStr = ((String) yValue).trim();
//					try {
//						// Parse and append only if numeric
//						Double num = Double.parseDouble(yStr);
//						jsonmap.append(num);
//					} catch (NumberFormatException e) {
//						// not numeric — skip
//						continue;
//					}
//				} else {
//					continue; // skip non-numeric values
//				}
//
//				if (i < xAxisValues.size() - 1) {
//					jsonmap.append(",");
//				}
//			}
//
//			// 🧹 Remove trailing comma if any
//			int lastIndex = jsonmap.lastIndexOf(",");
//			if (lastIndex == jsonmap.length() - 1) {
//				jsonmap.deleteCharAt(lastIndex);
//			}
//
//			jsonmap.append("],");
//			jsonmap.append("\"label\": \"" + yAxis + "\"");
//			jsonmap.append("}");
//
//			if (j < yAxes.size() - 1) {
//				jsonmap.append(",");
//			}
//		}
//
//		jsonmap.append("],\n \"chartLabels\": [ ");
//
//		for (String xValue : xAxisValues) {
//			jsonmap.append("\"" + xValue + "\",");
//		}
//
//		if (!xAxisValues.isEmpty()) {
//			jsonmap.deleteCharAt(jsonmap.lastIndexOf(","));
//		}
//
//		jsonmap.append("] \n }\n");
//
//		return jsonmap;
//	}
//	

	@GetMapping("/getAllKeys")
	public Set<String> getAllKeys(@RequestParam String apiUrl, @RequestParam Integer sureId) {
		List<Map<String, Object>> apiData = getAllKeyFromApi(apiUrl, sureId);
		return getAllKeys(apiData);
	}

	public List<Map<String, Object>> getAllKeyFromApi(String apiUrl, Integer sureId) {
		List<Map<String, Object>> apiData = new ArrayList<>();

		try {
			// Make a GET request using the provided URL
			ResponseEntity<Object> responseEntity = GETWithObject(apiUrl, sureId);

			// Convert the response to a List<Map<String, Object>>
			if (responseEntity.getBody() instanceof List) {
				// If the response is a list, assume it's a list of maps
				apiData = (List<Map<String, Object>>) responseEntity.getBody();
			} else {
				// If the response is not a list, assume it's a single map
				Map<String, Object> singleMap = new HashMap<>();
				singleMap.put("data", responseEntity.getBody());
				apiData.add(singleMap);
			}

		} catch (Exception e) {
			log.error(e.getLocalizedMessage());
		}

		return apiData;
	}

	private Set<String> getAllKeys(List<Map<String, Object>> apiData) {
		Set<String> allKeys = new HashSet<>();

		for (Map<String, Object> data : apiData) {
			allKeys.addAll(data.keySet());
		}

		return allKeys;
	}

	public List<Map<String, Object>> getAllDataFromApi(String apiUrl, Integer sureId) {
		List<Map<String, Object>> apiData = new ArrayList<>();

		try {
			// Make a GET request using the provided URL
			ResponseEntity<Object> responseEntity = GETWithObject(apiUrl, sureId);

			// Convert the response to a List<Map<String, Object>>
			if (responseEntity.getBody() instanceof List) {
				// If the response is a list, assume it's a list of maps
				apiData = (List<Map<String, Object>>) responseEntity.getBody();
			} else {
				// If the response is not a list, assume it's a single map
				Map<String, Object> singleMap = new HashMap<>();
				singleMap.put("data", responseEntity.getBody());
				apiData.add(singleMap);
			}

		} catch (Exception e) {
			log.error(e.getLocalizedMessage());

		}

		return apiData;
	}

	public ResponseEntity<Object> GET1(String get) {
		RestTemplate restTemplate = new RestTemplate();

		ResponseEntity<Object> u = restTemplate.getForEntity(get, Object.class);

		return u;

	}

	public ResponseEntity<String> GET(String url, Integer sureid) {
		RestTemplate restTemplate = new RestTemplate();

		HttpHeaders headers = new HttpHeaders();
		headers.setAccept(Collections.singletonList(MediaType.ALL)); // accept JSON or XML
		headers.setContentType(MediaType.APPLICATION_JSON);

		// 🔹 Add your token here (you can make it dynamic)
		String token = getToken(sureid); // helper method (see below)
		if (token != null && !token.isEmpty()) {
			headers.set("Authorization", "Bearer " + token);
		}

		HttpEntity<String> entity = new HttpEntity<>(headers);

		ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

		return response;
	}

	public ResponseEntity<Object> GETWithObject(String url, Integer sureid) {
		RestTemplate restTemplate = new RestTemplate();

		HttpHeaders headers = new HttpHeaders();
		headers.setAccept(Collections.singletonList(MediaType.ALL)); // accept JSON or XML
		headers.setContentType(MediaType.APPLICATION_JSON);

		// 🔹 Add your token here (you can make it dynamic)
		String token = getToken(sureid); // helper method (see below)
		if (token != null && !token.isEmpty()) {
			headers.set("Authorization", "Bearer " + token);
		}

		HttpEntity<String> entity = new HttpEntity<>(headers);

		ResponseEntity<Object> response = restTemplate.exchange(url, HttpMethod.GET, entity, Object.class);

		return response;
	}

	private String getToken(Integer sureid) {
		Sure_Connect connect = sureService.getbyid(sureid);
		String access_token = connect.getAccess_token();

		return access_token; // optional
	}

}
