package cokr.xit.fims.sndb.dao;

import java.util.List;

import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import cokr.xit.fims.crdn.Crdn;
import cokr.xit.fims.sndb.SndbQuery;
import cokr.xit.fims.sndb.SndngDtl;
import cokr.xit.foundation.component.AbstractMapper;
import cokr.xit.foundation.data.DataObject;

/** 발송 상세 정보 DAO
 *
 * <p>상세 설명:
 *
 * <pre>
 * ============ 변경 이력 ============
 * 2023-12-27	JoJH 최초 작성
 * ================================
 * </pre>
 */
@Mapper("sndngDtlMapper")
public interface SndngDtlMapper extends AbstractMapper {
	/**지정한 조건에 따라 발송 상세 목록을 조회하여 반환한다.<br />
	 * @param req 발송 상세 조회 조건
	 * @return 발송 상세 목록
	 */
	List<DataObject> selectSndngDtlList(SndbQuery req);

	/**지정한 조건에 따라 발송 상세 객체들을 반환한다.
	 * @param req 발송 상세 조회 조건
	 * @return 발송 상세 객체 목록
	 */
	List<DataObject> selectSndngDtls(SndbQuery req);

	/**지정한 조건에 따라 부과제외 대장 정보를 조회하여 반환한다.
	 * @param req 부과제외 대장 조회 조건
	 * @return 부과제외 대장 정보
	 */
	default DataObject selectSndngDtlInfo(SndbQuery req) {
		// 삭제 여부 확인
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		// 기본 정렬
		if (req.getOrderBy() == null) {
			req.setOrderBy("SD.SNDNG_DTL_ID DESC");
		}

		List<DataObject> sndngDtls = selectSndngDtls(req);
		return !sndngDtls.isEmpty() ? sndngDtls.get(0) : null;
	}

	/**발송 ID에 따라 발송 상세 ID를 반환한다.
	 * @param req 발송 상세 조회 조건
	 * @return 발송 상세 객체 목록
	 */
	List<DataObject> selectSndngTrgtDtlIds(SndbQuery req);

	List<SndngDtl> selectSndngDetails(SndbQuery req);

	/**발송 상세 정보를 등록한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int insertSndngDtl(SndngDtl sndngDtl);

	/**발송 상세 정보를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtl(SndngDtl sndngDtl);

	default int updateSndngDtls(Iterable<SndngDtl> sndngDtls) {
		int affected = 0;
		for (SndngDtl dtl: sndngDtls)
			affected += dtl != null ? updateSndngDtl(dtl) : 0;
		return affected;
	}

	/**지정한 발송 상세을 삭제한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int deleteSndngDtl(SndngDtl sndngDtl);

	/**발송 상세 정보의 발송 상세 상태 코드를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtlSttsCd(SndngDtl sndngDtl);

	/**차세대 세외수입 연계(A03)를 통해 발송 상세 정보를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtlNxrpA03(SndngDtl sndngDtl);

	/**발송 상세 정보의 발송 수납 코드를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtlRcvmtCd(SndngDtl sndngDtl);

	/**전자우편 발송상세 내역을 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtlEPost(SndngDtl sndngDtl);

	/**지정한 단속 ID로 단속, 부과 대장 객체를 반환한다.
	 * @param crdnId 단속 ID
	 * @return 단속, 부과 대장 객체
	 */
	DataObject selectCrdnLevy(String crdnId);

	/**발송 상세 정보의 발송 수납 코드를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateCrdnNxrpAcbKey(Crdn crdn);

	/**지정한 조건에 따라 발송 상세 목록을 조회하여 반환한다.
	 * @param req 발송 조회 조건
	 * @return 발송 상세 반송 정보
	 */
	List<DataObject> selectSndbkList(SndbQuery req);

	/**지정한 조건에 따라 발송 상세 객체들을 반환한다.
	 * @param req 발송 조회 조건
	 * @return 발송 상세 반송 정보
	 */
	List<DataObject> selectSndbks(SndbQuery req);

	/**지정한 조건에 따라 공시송달 대상 발송 상세 객체들을 반환한다.
	 * @param req 발송 조회 조건
	 * @return 발송 상세 반송 정보
	 */
	List<DataObject> selectSvbtcsTrgtSndngDtlIds(SndbQuery req);

	/**지정한 조건에 따라 발송 상세 객체의 마지막 1개를 반환한다.
	 * @param req 발송 조회 조건
	 * @return 발송 상세 반송 정보
	 */
	default DataObject selectSndbkInfo(SndbQuery req) {
		// 삭제여부
		if (req.getDelYn() == null) {
			req.setDelYn("N");
		}
		// 기본 정렬
		if (req.getOrderBy() == null) {
			req.setOrderBy("SD.SNDNG_DTL_ID DESC");
		}

		List<DataObject> sndbks = selectSndbks(req);

		return !sndbks.isEmpty() ? sndbks.get(0) : null;
	}

	/**발송 상세의 반송 정보를 등록한다.
	 * @param sndngDtl 발송 상세
	 * @return 저장된 정보수
	 */
	int createSndbk(SndngDtl sndngDtl);

	/**발송 상세의 반송 정보를 수정한다.
	 * @param sndngDtl 발송 상세
	 * @return 저장된 정보수
	 */
	int updateSndbk(SndngDtl sndngDtl);

	/**발송 상세의 반송 정보를 삭제한다.
	 * @param sndngDtl 발송 상세
	 * @return 저장된 정보수
	 */
	int deleteSndbk(SndngDtl sndngDtl);

	/**발송상세 대장에 공시송달ID에 해당하는 총건수 가져오기
	 * @param svbtcId 공시송달 ID
	 * @return 총건수
	 */
	int selectTnocsSndngDtlSvbtc(String svbtcId);

	/**발송 상세 정보의 반송 정보를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int updateSndngDtlSvbtc(SndngDtl sndngDtl);

	/**지정한 발송 상세을 삭제한다.
	 * @param params 파라미터
	 * <ul><li>"sndngDtl" - 발송 상세</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	int deleteSndngDtlSvbtc(SndngDtl sndngDtl);
}