package com.spring.common.error;

import java.util.List;
import java.util.stream.Collectors;

import org.springframework.validation.FieldError;

import lombok.Getter;

/**
 * 비즈니스 오류 응답을 나타내는 클래스입니다.
 * 
 * <p>이 클래스는 ErrorResponse를 확장하여 비즈니스 로직에서 발생한 오류에 대한
 * 응답을 구성하는 데 사용됩니다.</p>
 * 
 * <p>오류 규칙과 관련된 추가적인 오류 정보를 포함할 수 있습니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
@Getter
public class BizErrorResponse extends ErrorResponse {

    /**
     * 오류 목록을 나타내는 필드입니다.
     * 
     * <p>비즈니스 로직에서 발생한 오류에 대한 세부 정보를 포함합니다.</p>
     */
    private final List<RejectedValue> errors;

    /**
     * 주어진 오류 규칙과 오류 목록을 사용하여 BizErrorResponse를 초기화합니다.
     * 
     * @param exceptionRule 발생한 예외의 오류 규칙
     * @param errors 발생한 오류 목록
     */
    public BizErrorResponse(ErrorRule exceptionRule, List<RejectedValue> errors, String customMessage) {
        super(exceptionRule);
        this.errors = errors;
        this.customMessage = customMessage;
    }

    /**
     * 주어진 오류 규칙을 사용하여 BizErrorResponse 객체를 생성합니다.
     * 
     * <p>오류 목록은 null로 설정됩니다.</p>
     * 
     * @param exceptionRule 발생한 예외의 오류 규칙
     * @return 생성된 BizErrorResponse 객체
     */
    public static BizErrorResponse fromErrorRule(ErrorRule exceptionRule) {
        return new BizErrorResponse(exceptionRule, null, null);
    }

    public static BizErrorResponse of(ErrorRule exceptionRule, String message) {
        return new BizErrorResponse(exceptionRule, null, message);
    }

    /**
     * 주어진 필드 오류 목록을 기반으로 BizErrorResponse 객체를 생성합니다.
     * 
     * <p>필드 오류를 RejectedValue 객체로 변환하여 오류 목록을 구성합니다.</p>
     * 
     * @param fieldErrors 필드 오류 목록
     * @return 생성된 BizErrorResponse 객체
     */
    public static BizErrorResponse fromFieldError(List<FieldError> fieldErrors) {
        List<RejectedValue> errors = fieldErrors.stream()
            .map(fieldError -> RejectedValue.of(fieldError.getField(), fieldError.getRejectedValue(), fieldError.getDefaultMessage()))
            .collect(Collectors.toList());
        return new BizErrorResponse(ExceptionRule.UNPROCESSABLE_ENTITY, errors, null);
    }

}
