package com.eactive.ext.kjb.statistics;

import java.time.LocalDate;
import java.time.Year;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.eactive.eai.rms.ext.djb.job.ApiStatsHourlyAggregationJob;
import com.eactive.ext.kjb.statistics.job.DailyToMonthlyAggregationJob;
import com.eactive.ext.kjb.statistics.job.HourlyToDailyAggregationJob;
import com.eactive.ext.kjb.statistics.job.MonthlyToYearlyAggregationJob;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * API 통계 집계 수동 실행 Controller
 */
@Slf4j
@Controller
@RequiredArgsConstructor
public class ApiStatsAggregationController {

	private final HourlyToDailyAggregationJob hourlyToDailyAggregationJob;
	private final DailyToMonthlyAggregationJob dailyToMonthlyAggregationJob;
	private final MonthlyToYearlyAggregationJob monthlyToYearlyAggregationJob;
	
	private final ApiStatsHourlyAggregationJob apiStatsHourlyAggregationJob;

	@GetMapping(value = "/onl/kjb/statistics/apiStatsAggregationMan.view")
	public String view() {
		return "/onl/kjb/statistics/apiStatsAggregationMan";
	}
	
	/**
	 * 거래로그→시간별 통계 집계 수동 실행
	 * @param targetDate 집계 대상 날짜 (yyyyMMdd 형식, 예: 20250120)
	 * @return 처리 결과
	 */
	@PostMapping(value = "/onl/kjb/statistics/apiStatsAggregationMan.json", params = "cmd=AGGREGATION_HOUR")
	public ResponseEntity<Map<String, Object>> executeAggregationHourly(
			@RequestParam(required = false) String targetDate) {

		Map<String, Object> result = new HashMap<>();

		try {
			// 날짜 입력 검증
			if (targetDate == null || targetDate.trim().isEmpty()) {
				log.error("targetDate 미입력");
				result.put("success", false);
				result.put("message", "대상 날짜를 입력하세요. (예: 20250120)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			LocalDate date;
			try {
				date = LocalDate.parse(targetDate, DateTimeFormatter.ofPattern("yyyyMMdd"));
			} catch (DateTimeParseException e) {
				log.error("잘못된 날짜 형식: {}", targetDate);
				result.put("success", false);
				result.put("message", "잘못된 날짜 형식입니다. yyyyMMdd 형식으로 입력하세요. (예: 20250120)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			log.info("거래로그→시간별 통계 집계 수동 실행 시작. targetDate: {}", date);
			int count = apiStatsHourlyAggregationJob.executeManual(date);

			result.put("success", true);
			result.put("message", "거래로그→시간별 통계 집계가 완료되었습니다.");
			result.put("targetDate", date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
			result.put("processedCount", count);

			return ResponseEntity.ok(result);

		} catch (Exception e) {
			log.error("거래로그→시간별 통계 집계 실행 중 오류 발생", e);
			result.put("success", false);
			result.put("message", "집계 실행 중 오류가 발생했습니다: " + e.getMessage());
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
		}
	}
	
	/**
	 * 시간별→일별 통계 집계 수동 실행
	 * @param targetDate 집계 대상 날짜 (yyyyMMdd 형식, 예: 20250120)
	 * @return 처리 결과
	 */
	@PostMapping(value = "/onl/kjb/statistics/apiStatsAggregationMan.json", params = "cmd=AGGREGATION_DAY")
	public ResponseEntity<Map<String, Object>> executeHourlyToDaily(
			@RequestParam(required = false) String targetDate) {

		Map<String, Object> result = new HashMap<>();

		try {
			// 날짜 입력 검증
			if (targetDate == null || targetDate.trim().isEmpty()) {
				log.error("targetDate 미입력");
				result.put("success", false);
				result.put("message", "대상 날짜를 입력하세요. (예: 20250120)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			LocalDate date;
			try {
				date = LocalDate.parse(targetDate, DateTimeFormatter.ofPattern("yyyyMMdd"));
			} catch (DateTimeParseException e) {
				log.error("잘못된 날짜 형식: {}", targetDate);
				result.put("success", false);
				result.put("message", "잘못된 날짜 형식입니다. yyyyMMdd 형식으로 입력하세요. (예: 20250120)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			log.info("시간별→일별 통계 집계 수동 실행 시작. targetDate: {}", date);
			int count = hourlyToDailyAggregationJob.executeManual(date);

			result.put("success", true);
			result.put("message", "시간별→일별 통계 집계가 완료되었습니다.");
			result.put("targetDate", date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
			result.put("processedCount", count);

			return ResponseEntity.ok(result);

		} catch (Exception e) {
			log.error("시간별→일별 통계 집계 실행 중 오류 발생", e);
			result.put("success", false);
			result.put("message", "집계 실행 중 오류가 발생했습니다: " + e.getMessage());
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
		}
	}

	/**
	 * 일별→월별 통계 집계 수동 실행
	 * @param targetMonth 집계 대상 월 (yyyyMM 형식, 예: 202501)
	 * @return 처리 결과
	 */
	@PostMapping(value = "/onl/kjb/statistics/apiStatsAggregationMan.json", params = "cmd=AGGREGATION_MONTH")
	public ResponseEntity<Map<String, Object>> executeDailyToMonthly(
			@RequestParam(required = false) String targetMonth) {

		Map<String, Object> result = new HashMap<>();

		try {
			// 월 입력 검증
			if (targetMonth == null || targetMonth.trim().isEmpty()) {
				log.error("targetMonth 미입력");
				result.put("success", false);
				result.put("message", "대상 월을 입력하세요. (예: 202501)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			YearMonth month;
			try {
				month = YearMonth.parse(targetMonth, DateTimeFormatter.ofPattern("yyyyMM"));
			} catch (DateTimeParseException e) {
				log.error("잘못된 월 형식: {}", targetMonth);
				result.put("success", false);
				result.put("message", "잘못된 월 형식입니다. yyyyMM 형식으로 입력하세요. (예: 202501)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			log.info("일별→월별 통계 집계 수동 실행 시작. targetMonth: {}", month);
			int count = dailyToMonthlyAggregationJob.executeManual(month);

			result.put("success", true);
			result.put("message", "일별→월별 통계 집계가 완료되었습니다.");
			result.put("targetMonth", month.format(DateTimeFormatter.ofPattern("yyyyMM")));
			result.put("processedCount", count);

			return ResponseEntity.ok(result);

		} catch (Exception e) {
			log.error("일별→월별 통계 집계 실행 중 오류 발생", e);
			result.put("success", false);
			result.put("message", "집계 실행 중 오류가 발생했습니다: " + e.getMessage());
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
		}
	}

	/**
	 * 월별→연별 통계 집계 수동 실행
	 * @param targetYear 집계 대상 연도 (yyyy 형식, 예: 2024)
	 * @return 처리 결과
	 */
	@PostMapping(value = "/onl/kjb/statistics/apiStatsAggregationMan.json", params = "cmd=AGGREGATION_YEAR")
	public ResponseEntity<Map<String, Object>> executeMonthlyToYearly(
			@RequestParam(required = false) String targetYear) {

		Map<String, Object> result = new HashMap<>();

		try {
			// 연도 입력 검증
			if (targetYear == null || targetYear.trim().isEmpty()) {
				log.error("targetYear 미입력");
				result.put("success", false);
				result.put("message", "대상 연도를 입력하세요. (예: 2024)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			Year year;
			try {
				year = Year.parse(targetYear);
			} catch (DateTimeParseException e) {
				log.error("잘못된 연도 형식: {}", targetYear);
				result.put("success", false);
				result.put("message", "잘못된 연도 형식입니다. yyyy 형식으로 입력하세요. (예: 2024)");
				return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
			}

			log.info("월별→연별 통계 집계 수동 실행 시작. targetYear: {}", year);
			int count = monthlyToYearlyAggregationJob.executeManual(year);

			result.put("success", true);
			result.put("message", "월별→연별 통계 집계가 완료되었습니다.");
			result.put("targetYear", year.toString());
			result.put("processedCount", count);

			return ResponseEntity.ok(result);

		} catch (Exception e) {
			log.error("월별→연별 통계 집계 실행 중 오류 발생", e);
			result.put("success", false);
			result.put("message", "집계 실행 중 오류가 발생했습니다: " + e.getMessage());
			return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
		}
	}
}
