package cn.meowrain.aioj.backend.question.dto.chains;

import cn.meowrain.aioj.backend.framework.core.designpattern.chains.AbstractChianHandler;
import cn.meowrain.aioj.backend.framework.core.errorcode.ErrorCode;
import cn.meowrain.aioj.backend.framework.core.exception.ClientException;
import cn.meowrain.aioj.backend.question.common.enums.ChainMarkEnums;
import cn.meowrain.aioj.backend.question.dto.req.JudgeConfig;
import cn.meowrain.aioj.backend.question.dto.req.QuestionEditRequestDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 题目编辑时判题配置校验（可选字段）
 */
@Slf4j
@Component
public class QuestionEditJudgeConfigVerifyChain implements AbstractChianHandler<QuestionEditRequestDTO> {

	/**
	 * 默认时间限制（毫秒）
	 */
	private static final Long DEFAULT_TIME_LIMIT = 3000L;

	/**
	 * 最大时间限制（毫秒）- 10秒
	 */
	private static final Long MAX_TIME_LIMIT = 10000L;

	/**
	 * 最小时间限制（毫秒）
	 */
	private static final Long MIN_TIME_LIMIT = 100L;

	/**
	 * 默认内存限制（MB）
	 */
	private static final Long DEFAULT_MEMORY_LIMIT = 256L;

	/**
	 * 最大内存限制（MB）- 1GB
	 */
	private static final Long MAX_MEMORY_LIMIT = 1024L;

	/**
	 * 最小内存限制（MB）
	 */
	private static final Long MIN_MEMORY_LIMIT = 16L;

	@Override
	public void handle(QuestionEditRequestDTO requestParam) {
		JudgeConfig judgeConfig = requestParam.getJudgeConfig();

		// 判题配置是可选的，如果为空则跳过校验
		if (judgeConfig == null) {
			return;
		}

		// 如果提供了判题配置，则进行校验
		Long timeLimit = judgeConfig.getTimeLimit();
		if (timeLimit != null) {
			if (timeLimit < MIN_TIME_LIMIT) {
				throw new ClientException(
					String.format("时间限制不能小于 %d 毫秒", MIN_TIME_LIMIT),
					ErrorCode.PARAMS_ERROR
				);
			}
			if (timeLimit > MAX_TIME_LIMIT) {
				throw new ClientException(
					String.format("时间限制不能大于 %d 毫秒", MAX_TIME_LIMIT),
					ErrorCode.PARAMS_ERROR
				);
			}
		}

		Long memoryLimit = judgeConfig.getMemoryLimit();
		if (memoryLimit != null) {
			if (memoryLimit < MIN_MEMORY_LIMIT) {
				throw new ClientException(
					String.format("内存限制不能小于 %d MB", MIN_MEMORY_LIMIT),
					ErrorCode.PARAMS_ERROR
				);
			}
			if (memoryLimit > MAX_MEMORY_LIMIT) {
				throw new ClientException(
					String.format("内存限制不能大于 %d MB", MAX_MEMORY_LIMIT),
					ErrorCode.PARAMS_ERROR
				);
			}
		}

		log.debug("题目编辑判题配置校验通过: timeLimit={}ms, memoryLimit={}MB",
			timeLimit != null ? timeLimit : DEFAULT_TIME_LIMIT,
			memoryLimit != null ? memoryLimit : DEFAULT_MEMORY_LIMIT);
	}

	@Override
	public String mark() {
		return ChainMarkEnums.QUESTION_EDIT_PARAM_VERIFY_CHAIN.getMark();
	}

	@Override
	public int getOrder() {
		return 50;
	}
}
