package incheon.ags.dss.regen.service.impl;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import incheon.ags.dss.regen.mapper.UrbMdlMstMapper;
import incheon.ags.dss.regen.service.UrbMdlMstService;
import incheon.ags.dss.regen.vo.UrbMdlMstVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service("urbMdlMstService")
@RequiredArgsConstructor
@Slf4j
public class UrbMdlMstServiceImpl implements UrbMdlMstService {
	private final UrbMdlMstMapper urbMdlMstMapper;

    @Override
    public List<UrbMdlMstVO> selectUrbMdlMstList(UrbMdlMstVO searchVO) throws Exception {
        return urbMdlMstMapper.selectUrbMdlMstList(searchVO);
    }

    @Override
    public int selectUrbMdlMstListCnt(UrbMdlMstVO searchVO) throws Exception {
        return urbMdlMstMapper.selectUrbMdlMstListCnt(searchVO);
    }
    
    @Override
    public UrbMdlMstVO selectUrbMdlMstDetail(UrbMdlMstVO vo) throws Exception {
        return urbMdlMstMapper.selectUrbMdlMstDetail(vo);
    }
    
    /**
     * 모델 배치 정보 저장 (등록/수정)
     * (핵심 로직: mdl_se에 따라 3개의 FK를 정리)
     */
    @Override
    @Transactional
    public String saveUrbMdlMst(UrbMdlMstVO vo) throws Exception {
    	
        // --- 1. 비즈니스 로직: 모델 구분에 따라 FK 정리 ---
        String mdlSe = vo.getMdlSe();
        
        // DDL의 FK 컬럼(user_mdl_no, lib_idntf_no, img_no)이
        // NOT NULL이므로, 사용하지 않는 FK는 0으로 명확히 세팅
        
        if ("B".equals(mdlSe)) { // 라이브러리
            vo.setUserMdlNo(null); 
            vo.setImgNo(null);
            log.info("모델 구분 'L'(라이브러리) 선택. lib_idntf_no: {}", vo.getLibIdntfNo());
        } else if ("A".equals(mdlSe)) { // 사용자 모델
            vo.setLibIdntfNo(null);
            vo.setImgNo(null);
            log.info("모델 구분 'M'(사용자) 선택. user_mdl_no: {}", vo.getUserMdlNo());
        } else if ("C".equals(mdlSe)) { // 이미지
            vo.setLibIdntfNo(null);
            vo.setUserMdlNo(null);
            log.info("모델 구분 'I'(배경) 선택. img_no: {}", vo.getImgNo());
        } else {
            // (오류 또는 기본값)
            log.warn("Invalid mdlSe type: {}. All FKs set to 0.", mdlSe);
            vo.setLibIdntfNo(null);
            vo.setUserMdlNo(null);
            vo.setImgNo(null);
        }
        
        // --- 2. DB 저장 ---
        boolean isNew = !StringUtils.hasText(vo.getMdlNo()) || "0".equals(String.valueOf(vo.getMdlNo()));
        if (!isNew) {
            log.info("Updating UrbMdl (mdlNo: {})", vo.getMdlNo());
            urbMdlMstMapper.updateUrbMdlMst(vo);
            return vo.getMdlNo();
        } else {
            log.info("Inserting UrbMdl (mdlExpln: {})", vo.getMdlExpln());
            urbMdlMstMapper.insertUrbMdlMst(vo); // insert 후 vo.mdlNo에 PK 세팅
            return vo.getMdlNo();
        }
    }
    
    /**
     * 모델 배치 정보 삭제
     */
    @Override
    @Transactional
    public int deleteUrbMdlMst(UrbMdlMstVO vo) throws Exception {
        log.warn("Deleting UrbMdl (mdlNo: {})...", vo.getMdlNo());
        urbMdlMstMapper.deleteUrbMdlMst(vo);
        return 1;
    }
}