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

import java.util.Map;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import incheon.ags.dss.status.service.AnaLgdFomService;
import incheon.ags.dss.status.mapper.AnaLgdFomMapper;
import incheon.ags.dss.status.vo.AnaLgdFomMstVO;
import incheon.ags.dss.status.vo.AnaLgdFomDtlVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service("anaLgdFomService")
@RequiredArgsConstructor
@Slf4j
public class AnaLgdFomServiceImpl implements AnaLgdFomService {

    private final AnaLgdFomMapper anaLgdFomMapper;

    @Override
    public AnaLgdFomMstVO selectAnaLgdFomDetail(int lgdFrmNo) throws Exception {
        AnaLgdFomMstVO searchVO = new AnaLgdFomMstVO();
        searchVO.setLgdFrmNo(lgdFrmNo);
        
        // 1. 마스터 조회
        AnaLgdFomMstVO result = anaLgdFomMapper.selectAnaLgdFomMstDetail(searchVO);
        
        // 2. 상세 목록 조회 후 병합
        if (result != null) {
            result.setDtlList(anaLgdFomMapper.selectAnaLgdFomDtlList(lgdFrmNo));
        }
        return result;
    }

    @Override
    @Transactional
    public int saveAnaLgdFom(AnaLgdFomMstVO vo) throws Exception {
        // 1. 마스터 저장
        if (vo.getLgdFrmNo() != null && vo.getLgdFrmNo() > 0) {
            anaLgdFomMapper.updateAnaLgdFomMst(vo);
        } else {
            anaLgdFomMapper.insertAnaLgdFomMst(vo);
        }
        int lgdFrmNo = vo.getLgdFrmNo();

        // 2. 상세(Dtl) 재등록 (전체 삭제 후 Insert)
        anaLgdFomMapper.deleteAnaLgdFomDtlByMst(lgdFrmNo);
        
        if (vo.getDtlList() != null) {
            for (AnaLgdFomDtlVO dtl : vo.getDtlList()) {
                dtl.setLgdFrmNo(lgdFrmNo);
                dtl.setLOGIN_USER_ID(vo.getLOGIN_USER_ID()); // Audit ID 상속
                anaLgdFomMapper.insertAnaLgdFomDtl(dtl);
            }
        }
        return lgdFrmNo;
    }

    @Override
    public Map<String, Object> selectLegendConfigJson(int lgdFrmNo) throws Exception {
        // PostgreSQL JSON 쿼리 실행 결과 반환
        // 결과 Map 키: "jsonResult" (문자열 형태의 JSON일 수 있음)
        Map<String, Object> result = anaLgdFomMapper.selectLegendConfigJson(lgdFrmNo);
        
        // (참고: MyBatis가 JSON 타입을 String으로 줄 경우, Controller에서 파싱하거나 그대로 전달)
        return result;
    }
}