package com.kamco.cd.kamcoback.code.service;

import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.AddReq;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.Basic;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.ModifyReq;
import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.OrderReq;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.postgres.core.CommonCodeCoreService;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CommonCodeService {

  private final CommonCodeCoreService commonCodeCoreService;

  /**
   * 공통코드 목록 조회
   *
   * @return 모튼 코드 정보
   */
  @Cacheable(value = "commonCodes")
  public List<Basic> getFindAll() {
    return commonCodeCoreService.findAll();
  }

  /**
   * 공통코드 단건 조회
   *
   * @param id
   * @return 코드 아이디로 조회한 코드 정보
   */
  public Basic getOneById(Long id) {
    return commonCodeCoreService.getOneById(id);
  }

  /**
   * 공통코드 생성 요청
   *
   * @param req 생성요청 정보
   * @return 생성된 코드 id
   */
  @Transactional
  @CacheEvict(value = "commonCodes", allEntries = true)
  public ApiResponseDto.ResponseObj save(AddReq req) {
    return commonCodeCoreService.save(req);
  }

  /**
   * 공통코드 수정 요청
   *
   * @param id 코드 아이디
   * @param req 수정요청 정보
   */
  @Transactional
  @CacheEvict(value = "commonCodes", allEntries = true)
  public ApiResponseDto.ResponseObj update(Long id, ModifyReq req) {
    return commonCodeCoreService.update(id, req);
  }

  /**
   * 공통코드 삭제 처리
   *
   * @param id 코드 아이디
   */
  @Transactional
  @CacheEvict(value = "commonCodes", allEntries = true)
  public ApiResponseDto.ResponseObj removeCode(Long id) {
    return commonCodeCoreService.removeCode(id);
  }

  /**
   * 공통코드 순서 변경
   *
   * @param req id, order 정보를 가진 List
   */
  @Transactional
  @CacheEvict(value = "commonCodes", allEntries = true)
  public ApiResponseDto.ResponseObj updateOrder(OrderReq req) {
    return commonCodeCoreService.updateOrder(req);
  }

  /**
   * 코드기반 조회
   *
   * @param code 코드
   * @return 코드로 조회한 공통코드 정보
   */
  public List<Basic> findByCode(String code) {
    return commonCodeCoreService.findByCode(code);
  }

  /**
   * 중복 체크
   *
   * @param parentId
   * @param code
   * @return
   */
  public ApiResponseDto.ResponseObj getCodeCheckDuplicate(Long parentId, String code) {
    return commonCodeCoreService.getCodeCheckDuplicate(parentId, code);
  }

  /**
   * 공통코드 이름 조회
   *
   * @param parentCodeCd 상위 코드
   * @param childCodeCd 하위 코드
   * @return 공통코드명
   */
  public Optional<String> getCode(String parentCodeCd, String childCodeCd) {
    return commonCodeCoreService.getCode(parentCodeCd, childCodeCd);
  }
}
