package com.eactive.eai.rms.common.scheduler;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

@Component
public class CronDescription {

	private static final String[] TIME_UNITS = { "초", "분", "시" };

	public String makeCronDescription(String cronExp) {
		if (cronExp == null || cronExp.trim().isEmpty()) {
			return "잘못된 Cron 표현식입니다.";
		}

		String[] cronParts = StringUtils.split(cronExp, " ");
		if (cronParts == null || (cronParts.length != 6 && cronParts.length != 7)) {
			return "잘못된 Cron 표현식 길이입니다.";
		}

		StringBuilder description = new StringBuilder();

		// 년 포함 여부에 따라 처리
		if (cronParts.length == 6) {
			buildDescriptionForSixParts(cronParts, description);
		} else {
			// 년을 포함하는 경우의 로직을 여기에 추가할 수 있습니다.
		}

		return description.toString().trim();
	}

	private void buildDescriptionForSixParts(String[] cronParts, StringBuilder description) {
		// 초, 분, 시, 일 순으로 설명 추가
		for (int i = 3; i >= 0; i--) {
			addTimeUnitDescription(cronParts, i, description);
		}

		prependGeneralTimeDescription(cronParts, description);
	}

	private void addTimeUnitDescription(String[] cronParts, int index, StringBuilder description) {
		String cronPart = cronParts[index];
		if (!"*".equals(cronPart) && !"?".equals(cronPart)) {
			if (index == 3) {
				description.append("매월 ").append(cronPart).append("일 ");
			} else if (cronPart.contains("/")) {
				String[] fromTo = StringUtils.split(cronPart, "/");
				description
						.append(fromTo[0])
						.append(TIME_UNITS[index])
						.append(" 부터 ")
						.append(fromTo[1])
						.append(TIME_UNITS[index])
						.append(" 간격으로 ");
			} else {
				description.append(cronPart).append(TIME_UNITS[index]).append(" ");
			}
		}
	}

	private void prependGeneralTimeDescription(String[] cronParts, StringBuilder description) {
		if ("*".equals(cronParts[3]) || "?".equals(cronParts[3])) {
			if ("*".equals(cronParts[2]) || "?".equals(cronParts[2])) {
				if (!"*".equals(cronParts[1]) && !"?".equals(cronParts[1])) {
					description.insert(0, "매시 ");
				} else {
					description.insert(0, "매분 ");
				}
			} else {
				description.insert(0, "매일 ");
			}
		}
	}

}
