package com.bio.bio_backend.global.utils;

import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import com.bio.bio_backend.domain.admin.common_code.dto.CommonCodeDto;
import com.bio.bio_backend.domain.admin.common_code.dto.CommonGroupCodeDto;
import com.bio.bio_backend.domain.admin.common_code.service.CommonCodeService;
import java.util.List;
import java.util.Optional;

/**
 * 공통 코드 관련 유틸리티 클래스
 * 다른 서비스의 비즈니스 로직에서 공통 코드를 쉽게 조회할 수 있도록 제공
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class CommonCodeUtils {
    
    private final CommonCodeService commonCodeService;
    
    /**
     * 코드로 공통 코드 조회
     */
    public CommonCodeDto getCode(String code) {
        try {
            return commonCodeService.getCode(code);
        } catch (Exception e) {
            log.warn("공통 코드 조회 실패: code={}, error={}", code, e.getMessage());
            return null;
        }
    }
    
    /**
     * 코드로 공통 코드 조회 (Optional 반환)
     */
    public Optional<CommonCodeDto> getCodeOptional(String code) {
        try {
            return Optional.of(commonCodeService.getCode(code));
        } catch (Exception e) {
            log.warn("공통 코드 조회 실패: code={}, error={}", code, e.getMessage());
            return Optional.empty();
        }
    }
    
    /**
     * 그룹 코드로 활성화된 공통 코드 목록 조회
     */
    public List<CommonCodeDto> getActiveCodesByGroup(String groupCode) {
        try {
            return commonCodeService.getActiveCodesByGroupCode(groupCode);
        } catch (Exception e) {
            log.warn("그룹별 공통 코드 조회 실패: groupCode={}, error={}", groupCode, e.getMessage());
            return List.of();
        }
    }
    
    /**
     * 부모 코드로 활성화된 공통 코드 목록 조회
     */
    public List<CommonCodeDto> getActiveCodesByParent(String parentCode) {
        try {
            return commonCodeService.getActiveCodesByParentCode(parentCode);
        } catch (Exception e) {
            log.warn("부모 코드별 공통 코드 조회 실패: parentCode={}, error={}", parentCode, e.getMessage());
            return List.of();
        }
    }
    
    /**
     * 그룹 코드 정보 조회
     */
    public CommonGroupCodeDto getGroupCode(String groupCode) {
        try {
            return commonCodeService.getGroupCode(groupCode);
        } catch (Exception e) {
            log.warn("그룹 코드 조회 실패: groupCode={}, error={}", groupCode, e.getMessage());
            return null;
        }
    }
    
    /**
     * 코드명으로 공통 코드 조회 (그룹 내에서)
     */
    public CommonCodeDto getCodeByName(String groupCode, String name) {
        try {
            List<CommonCodeDto> codes = commonCodeService.getActiveCodesByGroupCode(groupCode);
            return codes.stream()
                .filter(code -> name.equals(code.getName()))
                .findFirst()
                .orElse(null);
        } catch (Exception e) {
            log.warn("이름으로 공통 코드 조회 실패: groupCode={}, name={}, error={}", 
                    groupCode, name, e.getMessage());
            return null;
        }
    }
    
    /**
     * 코드 존재 여부 확인
     */
    public boolean existsCode(String code) {
        return getCodeOptional(code).isPresent();
    }
    
    /**
     * 그룹 코드 존재 여부 확인
     */
    public boolean existsGroupCode(String groupCode) {
        try {
            commonCodeService.getGroupCode(groupCode);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 코드 값 검증 (코드가 존재하고 활성화되어 있는지 확인)
     */
    public boolean isValidCode(String groupCode, String code) {
        try {
            CommonCodeDto codeDto = commonCodeService.getCode(code);
            return codeDto != null && 
                   groupCode.equals(codeDto.getGroupCode()) && 
                   Boolean.TRUE.equals(codeDto.getUseFlag());
        } catch (Exception e) {
            return false;
        }
    }
}
