package incheon.cmm.ahm.flight.service.impl;

import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import incheon.cmm.ahm.flight.vo.G2fFlightVO;
import incheon.cmm.ahm.flight.service.G2fFlightService;
import incheon.cmm.ahm.flight.mapper.G2fFlightMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class G2fFlightServiceImpl extends EgovAbstractServiceImpl implements G2fFlightService {
    
    private final G2fFlightMapper mapper;
    
    public G2fFlightServiceImpl(G2fFlightMapper mapper) {
        this.mapper = mapper;
    }
    
    @Override
    public G2fFlightVO getById(Integer nfId) {
        return mapper.findById(nfId);
    }
    
    @Override
    public List<G2fFlightVO> getList() {
        return mapper.findAll();
    }
    
    @Override
    public List<G2fFlightVO> getList(String searchKeyword, String searchType, int page, int size) {
        int offset = (page - 1) * size;
        return mapper.findAllWithPaging(searchKeyword, searchType, size, offset);
    }
    
    @Override
    public int getTotalCount(String searchKeyword, String searchType) {
        return mapper.count(searchKeyword, searchType);
    }
    
    @Override
    @Transactional
    public void create(G2fFlightVO poi) {
        mapper.insert(poi);
    }
    
    @Override
    @Transactional
    public void update(G2fFlightVO poi) {
        mapper.update(poi);
    }
    
    @Override
    @Transactional
    public void delete(Integer nfId) {
        mapper.delete(nfId);
    }
    
    @Override
    public boolean checkDuplicate(String lyrSrvcPrefix, String lyrSrvcNm, String lyrSrvcMatrixNm, String extn) {
        int count = mapper.countByUniqueKey(null, lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn);
        return count > 0;
    }
    
    @Override
    public boolean checkDuplicateForUpdate(Integer flightPhotoLyrId, String lyrSrvcPrefix, String lyrSrvcNm, String lyrSrvcMatrixNm, String extn) {
        int count = mapper.countByUniqueKey(flightPhotoLyrId, lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn);
        return count > 0;
    }
    
    @Override
    public Map<String, Object> checkDuplicateWithDetails(String lyrSrvcPrefix, String lyrSrvcNm, String lyrSrvcMatrixNm, String extn, String srid) {
        Map<String, Object> result = new HashMap<>();
        
        G2fFlightVO existing = mapper.findByUniqueKey(null, lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn);
        
        if (existing != null) {
            result.put("isDuplicate", true);
            result.put("existingData", existing);
            result.put("duplicateFields", buildDuplicateFieldsInfo(lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn, srid));
        } else {
            result.put("isDuplicate", false);
            result.put("checkedFields", buildDuplicateFieldsInfo(lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn, srid));
        }
        
        return result;
    }
    
    @Override
    public Map<String, Object> checkDuplicateWithDetailsForUpdate(Integer flightPhotoLyrId, String lyrSrvcPrefix, String lyrSrvcNm, String lyrSrvcMatrixNm, String extn, String srid) {
        Map<String, Object> result = new HashMap<>();
        
        G2fFlightVO existing = mapper.findByUniqueKey(flightPhotoLyrId, lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn);
        
        if (existing != null) {
            result.put("isDuplicate", true);
            result.put("existingData", existing);
            result.put("duplicateFields", buildDuplicateFieldsInfo(lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn, srid));
        } else {
            result.put("isDuplicate", false);
            result.put("checkedFields", buildDuplicateFieldsInfo(lyrSrvcPrefix, lyrSrvcNm, lyrSrvcMatrixNm, extn, srid));
        }
        
        return result;
    }
    
    /**
     * 중복된 필드 정보 생성
     */
    private Map<String, String> buildDuplicateFieldsInfo(String lyrSrvcPrefix, String lyrSrvcNm, String lyrSrvcMatrixNm, String extn, String srid) {
        Map<String, String> fields = new HashMap<>();
        fields.put("lyrSrvcPrefix", lyrSrvcPrefix != null && !lyrSrvcPrefix.isEmpty() ? lyrSrvcPrefix : "(없음)");
        fields.put("lyrSrvcNm", lyrSrvcNm);
        fields.put("lyrSrvcMatrixNm", lyrSrvcMatrixNm != null && !lyrSrvcMatrixNm.isEmpty() ? lyrSrvcMatrixNm : "(없음)");
        fields.put("extn", extn);
        fields.put("srid", srid);
        return fields;
    }
}