package cokr.xit.fims.base.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.egovframe.rte.psl.dataaccess.mapper.Mapper;

import cokr.xit.applib.SQLUtil;
import cokr.xit.fims.base.FimsSigungu;
import cokr.xit.fims.base.OgdpQuery;
import cokr.xit.foundation.component.AbstractMapper;
import cokr.xit.foundation.data.DataObject;

@Mapper("ogdpMapper")
public interface OgdpMapper extends AbstractMapper {
	public static String select = """
    SELECT D.DEPT_CD                <!-- 부서 코드 -->
         , D.SGG_CD                 <!-- 시군구 코드 -->
         , (SELECT SGG_NM FROM TB_SGG WHERE SGG_CD = D.SGG_CD) AS SGG_NM <!-- 시군구 명 -->
         , D.INST_CD                <!-- 기관 코드 -->
         , (SELECT INST_NM FROM TB_SGG WHERE INST_CD = D.INST_CD) AS INST_NM <!-- 기관 명 -->
         , D.DEPT_NM                <!-- 부서 명 -->
         , D.DEPT_TELNO             <!-- 부서 전화번호 -->
         , D.DEPT_FXNO              <!-- 부서 팩스번호 -->
         , D.USE_YN                 <!-- 사용 여부 -->
         , (CASE D.USE_YN WHEN 'Y' THEN '사용' WHEN 'N' THEN '미사용' ELSE '' END) AS USE_YN_NM <!-- 사용 여부 명 -->
         , D.REG_DT                 <!-- 등록 일시 -->
         , D.RGTR                   <!-- 등록자 -->
             , D.MDFCN_DT               <!-- 수정 일시 -->
             , D.MDFR                   <!-- 수정자 -->
	         , D.CVLCPT_LINK_SE_CD      <!-- 민원 연계 구분 코드 -->
	         , D.VRBACNT_LINK_SE_CD     <!-- 가상계좌 연계 구분 코드 -->
	         , D.PSTOFC_NM              <!-- 우체국 명 -->
	         , D.RG_NO_HEADER           <!-- 등기 번호 헤더 -->
	         , D.SNDNG_LINK_SE_CD       <!-- 발송 연계 구분 코드 -->
	         , D.EGP_CON_ORG            <!-- E그린 외부기관구분코드 -->
	         , D.EGP_RCEPT_ID           <!-- E그린 접수우체국국기호 -->
	         , D.EGP_APVL_NB            <!-- E그린 후납계약승인번호 -->
	         , D.EGP_ESB_PATH           <!-- E그린 ESB경로 -->
	         , D.EGP_POST_INST_ID       <!-- E그린 우정정보센터 기관ID -->
	         , D.EGP_CERT_CN            <!-- E그린 인증서CN -->
	         , D.ENS_INTERFACE_ID       <!-- 세외수입 인터페이스ID -->
	         , D.ENS_SOURCE_CD          <!-- 세외수입 소스코드 -->
	         , D.ENS_TARGET_CD          <!-- 세외수입 타겟코드 -->
	         , D.ENS_URL                <!-- 세외수입 URL -->
	         , D.NXRP_LINK_YN           <!-- 세외수입 연계 여부 -->
	         , D.NXRP_LINK_SRVC_URL     <!-- 세외수입 연계 서비스 URL -->
	         , D.NXRP_RGN_SE_CD         <!-- 세외수입 지역 구분 코드 -->
	         , D.DTBN_BANK_NM           <!-- 교부 은행 명 -->
	         , D.DTBN_ACTNO             <!-- 교부 계좌번호 -->
	         , D.DOC_HEADER             <!-- 문서 머릿말 -->
	         , D.SRVR_OS                <!-- 서버 OS -->
	         FROM TB_DEPT      D
				<where>
			        <if test="sggCd != null">
			       AND D.SGG_CD     =  #{sggCd}     <!-- 시군구 코드 -->
			        </if>
			        <if test="deptCd != null">
			       AND D.DEPT_CD    =  #{deptCd}    <!-- 부서 코드 -->
			        </if>
			        <if test="instCd != null">
			       AND D.INST_CD    =  #{instCd}    <!-- 기관 코드 -->
			        </if>
			        <if test="useYn != null">
			       AND D.USE_YN     =  #{useYn}     <!-- 사용 여부 -->
			        </if>
			    </where>
				""";

	@Select(SQLUtil.SCRIPT_START+"""
	/* 유저 수 조회(ogdpMapper.countUser) */
    SELECT COUNT(*)
      FROM TB_SGG A
     WHERE USE_YN = 'Y'
     AND SGG_CD = #{sggCd}
	"""+SQLUtil.SCRIPT_END)
	int countUser(String sggCd);

	/**시군구 설정 정보를 수정한다.
	 * @param sgg 시군구
	 * @return 저장 여부
	 * <ul><li>저장됐으면 true</li>
	 *     <li>그렇지 않으면 false</li>
	 * </ul>
	 */
	default boolean updateSggStng(FimsSigungu sgg) {
		return sgg != null && updateSggStng(params().set("sgg", sgg)) == 1;
	}

	/**시군구 설정 정보를 수정한다.
	 * @param params 파라미터
	 * <ul><li>"sgg" - 시군구 설정 정보</li>
	 *     <li>"currentUser" - 현재 접속한 사용자</li>
	 * </ul>
	 * @return 저장된 정보수
	 */
	@Update(SQLUtil.SCRIPT_START+"""
	/* 시군구 설정 정보 수정 (ogdpMapper.updateSggStng) */
	UPDATE TB_SGG
	   SET MDFCN_DT         =
	   """
	   +SQLUtil.now
	   +"""
	     , MDFR             = #{sgg.modifiedBy}
	     , UP_SGG_CD        = #{sgg.upSggCd}
	     <if test="sgg.symbolFilepath != null">
	     , SYMBOL_FILE_PATH = #{sgg.symbolFilepath} <!-- 상징 파일 경로 -->
	     , SYMBOL_FILE_NM   = #{sgg.symbolFilename}   <!-- 상징 파일 명 -->
	     </if>
	     <if test="sgg.logoFilepath != null">
	     , LOGO_FILE_PATH   = #{sgg.logoFilepath}   <!-- 로고 파일 경로 -->
	     , LOGO_FILE_NM     = #{sgg.logoFilename}     <!-- 로고 파일 명 -->
	     </if>
	     <if test="sgg.officialSealFilepath != null">
	     , OFFCS_FILE_PATH  = #{sgg.officialSealFilepath}  <!-- 직인 파일 경로 -->
	     , OFFCS_FILE_NM    = #{sgg.officialSealFilename}    <!-- 직인 파일 명 -->
	     </if>
	 WHERE SGG_CD = #{sgg.sggID}
	"""+SQLUtil.SCRIPT_END)
	int updateSggStng(Map<String, Object> params);

	/**지정한 조건에 따라 시군구 설정 객체를 반환한다.
	 * @param req 시군구 조회 조건
	 * @return 시군구 객체
	 */
	default DataObject selectSggStngInfo(OgdpQuery req) {
		// 사용 여부 확인
		if (req.getUseYn() == null) {
			req.setUseYn("Y");
		}

		return selectSggStng(req);
	}

	/**지정한 조건에 따라 시군구 설정 객체들을 반환한다.
	 * @param req 시군구 조회 조건
	 * @return 시군구 객체 목록
	 */
	@Select(SQLUtil.SCRIPT_START+"""
	/* 시군구 설정 객체 가져오기(ogdpMapper.selectSgg) */
	SELECT S.SGG_CD           <!-- 시군구 코드 -->
	     , S.SGG_NM           <!-- 시군구 명 -->
	     , S.INST_SE_CD       <!-- 기관 구분 코드 -->
	     , S.INST_CD          <!-- 기관 코드 -->
	     , S.INST_NM          <!-- 기관 명 -->
	     , (CASE
	        WHEN S.INST_DADDR IS NULL OR S.INST_DADDR = ''
	        THEN S.INST_ADDR
	        ELSE CONCAT(S.INST_ADDR,' ',S.INST_DADDR)
	        END) AS INST_FULL_ADDR <!-- 기관 전체 주소 -->
	     , S.INST_ADDR        <!-- 기관 기본 주소 -->
	     , S.INST_DADDR       <!-- 기관 상세 주소 -->
	     , S.INST_ZIP         <!-- 기관 우편번호 -->
	     , S.SYMBOL_FILE_PATH <!-- 상징 파일 경로 -->
	     , S.SYMBOL_FILE_NM   <!-- 상징 파일 명 -->
	     , S.LOGO_FILE_PATH   <!-- 로고 파일 경로 -->
	     , S.LOGO_FILE_NM     <!-- 로고 파일 명 -->
	     , S.OFFCS_FILE_PATH  <!-- 직인 파일 경로 -->
	     , S.OFFCS_FILE_NM    <!-- 직인 파일 명 -->
	     , S.UP_SGG_CD        <!-- 상위시군구코드 -->
	  FROM TB_SGG S
	  <where>
	        <if test="sggCd != null">
	       AND S.SGG_CD     =  #{sggCd}     <!-- 시군구 코드 -->
	        </if>
	        <if test="useYn != null">
	       AND S.USE_YN     =  #{useYn}     <!-- 사용 여부 -->
	        </if>
	    </where>
	"""+SQLUtil.SCRIPT_END)
	DataObject selectSggStng(OgdpQuery req);

	@Update(SQLUtil.SCRIPT_START+"""
    /* 부서 설정 수정(ogdpMapper.updateDeptStng) */
    UPDATE TB_DEPT
	       SET MDFCN_DT             =
	"""+SQLUtil.now+"""
	            <!-- 수정 일시 -->
	         , MDFR                 = #{dept.modifiedBy}        <!-- 수정자 -->
			 , CVLCPT_LINK_SE_CD    = #{dept.cvlcptLinkSeCd}    <!-- 민원 연계 구분 코드 -->
			 , VRBACNT_LINK_SE_CD   = #{dept.vrbacntLinkSeCd}   <!-- 가상계좌 연계 구분 코드 -->
             , PSTOFC_NM            = #{dept.pstofcNm}          <!-- 우체국 명 -->
             , RG_NO_HEADER         = #{dept.rgNoHeader}        <!-- 등기 번호 헤더 -->
             , SNDNG_LINK_SE_CD     = #{dept.sndngLinkSeCd}     <!-- 발송 연계 구분 코드 -->
             , EGP_CON_ORG          = #{dept.egpConOrg}         <!-- E그린 외부기관구분코드 -->
             , EGP_RCEPT_ID         = #{dept.egpRceptId}        <!-- E그린 접수우체국국기호 -->
             , EGP_APVL_NB          = #{dept.egpApvlNb}         <!-- E그린 후납계약승인번호 -->
             , EGP_ESB_PATH         = #{dept.egpEsbPath}        <!-- E그린 ESB경로 -->
             , EGP_POST_INST_ID     = #{dept.egpPostInstId}     <!-- E그린 우정정보센터 기관ID -->
             , EGP_CERT_CN          = #{dept.egpCertCn}         <!-- E그린 인증서CN -->
             , ENS_INTERFACE_ID     = #{dept.ensInterfaceId}    <!-- 세외수입 인터페이스ID -->
             , ENS_SOURCE_CD        = #{dept.ensSourceCd}       <!-- 세외수입 소스코드 -->
             , ENS_TARGET_CD        = #{dept.ensTargetCd}       <!-- 세외수입 타겟코드 -->
             , ENS_URL              = #{dept.ensUrl}            <!-- 세외수입 URL -->
             , NXRP_LINK_YN         = #{dept.nxrpLinkYn}        <!-- 세외수입 연계 여부 -->
             , NXRP_RGN_SE_CD       = #{dept.nxrpRgnSeCd}       <!-- 세외수입 지역 구분 코드 -->
             , DTBN_BANK_NM         = #{dept.dtbnBankNm}        <!-- 교부 은행 명 -->
             , DTBN_ACTNO           = #{dept.dtbnActno}         <!-- 교부 계좌번호 -->
             , DOC_HEADER           = #{dept.docHeader}         <!-- 문서 머릿말 -->
             , SRVR_OS              = #{dept.srvrOs}            <!-- 서버 OS -->
         WHERE DEPT_CD              = #{dept.deptID}
          AND USE_YN               = 'Y'
    """
    +SQLUtil.SCRIPT_END)
	int updateDeptStng(Map<String, Object> params);

	@Select(SQLUtil.SCRIPT_START
			+ " /* 부서 설정 객체 가져오기(ogdpMapper.selectDeptInfo) */ "
			+ select
			+ SQLUtil.SCRIPT_END)
	DataObject selectDeptStngInfo(OgdpQuery req);

	@Select(SQLUtil.SCRIPT_START
			+ " /* 부서 설정 객체 목록 가져오기(ogdpMapper.selectDeptList) */ "
			+ SQLUtil.pagingPrefix
			+ select
			+ SQLUtil.orderBy
			+ SQLUtil.pagingSuffix
			+ SQLUtil.SCRIPT_END)
	List<DataObject> selectDeptStngList(OgdpQuery query);
}