<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="i2c.cmm.push.dao.PushDAO">

	<sql id="conditionQuery">		
	   AND SSM.SCHDL_MSG_ID = SRU.MSG_ID
       AND SRU.PUSH_SND_AT = #{push_snd_at}
       AND SSM.BIZ_TP_CD IN
              <foreach collection="badge_except_cds" item="item" index="i" open="(" close=")" separator=",">
              #{item}
              </foreach>	
	</sql>

    <select id="listPushMessage" parameterType="java.util.Map" resultType="i2c.cmm.base.CommonResultMap">
        /* [i2c.cmm.push.dao.PushDAO.listPushMessage] 푸쉬 메시지 목록 추출 */
        SELECT SM.MSG_ID
             , SRU.RECV_ID
             , SRU.USR_ID
             , SUC.PUSH_TOKEN
             , SSM.TAR_OBJ_ID
             , SM.BIZ_TP_CD
             , SM.BIZ_SUB_TP_CD
             , SM.MSG_CNTN
             , SC.CLIENT_TP_CD
             , (CASE WHEN (SM.BIZ_TP_CD = 'PROPS') 
		             THEN (SELECT PP.PROPSE_OPEN_AT
		                    FROM PETIT_PROPSE PP
		                   WHERE PP.PETIT_PROPSE_ID = SSM.TAR_OBJ_ID)
		       		 WHEN (SM.BIZ_TP_CD = 'VOTE')
		             THEN CASE WHEN (SELECT VQ.CLSDR_AT
		                              FROM VOTE_QUSTNR VQ
		                             WHERE VQ.VOTE_QUSTNR_ID = SSM.TAR_OBJ_ID) = 'Y'
		                       THEN 'N'
		                       WHEN (SELECT VQ.CLSDR_AT
		                              FROM VOTE_QUSTNR VQ
		                             WHERE VQ.VOTE_QUSTNR_ID = SSM.TAR_OBJ_ID) = 'N'
		                       THEN 'Y'
		                  ELSE NULL 
		                   END 
		        	 WHEN (SM.BIZ_TP_CD = 'NOTICE') AND SM.BIZ_SUB_TP_CD IN ('NOTICE', 'OPINION', 'HELP')    
		             THEN CASE WHEN (SELECT B.LOCK_AT
		                              FROM BOARD B
		                             WHERE B.BOARD_ID = SSM.TAR_OBJ_ID) = 'Y'
		                       THEN 'N'
		                       WHEN (SELECT B.LOCK_AT
		                              FROM BOARD B
		                             WHERE B.BOARD_ID = SSM.TAR_OBJ_ID) = 'N'
		                       THEN 'Y'
		                  ELSE NULL 
		                   END 
		       	ELSE NULL
		         END 
		       ) OPEN_AT
             <!-- , (SELECT COUNT(SRU2.RECV_ID) 
                  FROM SNS_RECV_USER SRU2 
                 WHERE SRU2.USR_ID = SUC.USR_ID 
                   AND SRU2.PUSH_SND_AT = #{push_snd_at}
	           ) BADGE -->
	           <!-- BADGE 수정 2017.07.21 by ksjqqq -->
	         , (SELECT COUNT(SRU.RECV_ID)
				  FROM SNS_RECV_USER SRU
				 WHERE SRU.USR_ID = SUC.USR_ID
                   AND SRU.CONFIRM_DTTM IS NULL
                   AND NOT EXISTS (SELECT 'X' 
                                     FROM SNS_MESSAGE SM 
                                    WHERE SM.MSG_ID    = SRU.MSG_ID 
                                      AND SM.BIZ_TP_CD IN
                                      <foreach collection="badge_except_cds" item="item" index="i" open="(" close=")" separator=",">
                                       #{item}
                                      </foreach>)
				) BADGE
			 , SM.CRT_DTTM
			 , CASE WHEN DATE(SYSDATE())- DATE(DATE_FORMAT(SM.CRT_DTTM,'%Y-%m-%d %H:%m:%s')) > 1 
			        THEN 'FAIL' 
			        ELSE 'SUCC' 
			        END SEND_FLAG /* FAIL 이면 전송하지 않고 전송FAIL 처리 */ 
			 , SSM.SEND_SE
          FROM SNS_MESSAGE SM, SNS_SCHEDULE_MESSAGE SSM, SNS_RECV_USER SRU
             , SNS_USER_CLIENT SUC, SNS_CLIENT SC
         WHERE SM.MSG_ID       = SSM.SCHDL_MSG_ID
           AND SM.MSG_ID       = SRU.MSG_ID
           AND SRU.USR_ID      = SUC.USR_ID
           AND SUC.CLIENT_ID   = SC.CLIENT_ID
           AND SRU.PUSH_SND_AT = #{push_snd_at}
           AND SC.CLIENT_TP_CD IN
           <foreach collection="client_types" item="item" index="i" open="(" close=")" separator=",">
            #{item}
           </foreach>
           AND SUC.PUSH_TOKEN IS NOT NULL <!-- /* 토큰 정보 있는 경우에만 전송 可 */ -->
         ORDER BY SM.CRT_DTTM
	</select>
	
	<update id="updatePushMessageUser" parameterType="java.util.Map">
	    /* [i2c.cmm.push.dao.PushDAO.updatePushMessageUser] 푸쉬 대상 상태 변경 */
	    UPDATE SNS_RECV_USER 
	       SET PUSH_SND_AT = #{update_push_snd_at}
	       <if test="update_push_snd_at == 'Y'.toString()">
	         , PUSH_SND_DTTM = DATE_FORMAT(SYSDATE(),'%Y%m%d%H%m%s')
             , PUSH_SNDR_ID  = #{push_sndr_id}
	       </if>	       
	     <!-- 대기상태('D') 변경은 전체 업데이트 -->
	     <if test="@i2c.cmm.util.StringUtil@isEmpty(recv_id)">
	     WHERE RECV_ID IN (
	     		SELECT 
					   RECV_ID					 
	     		  FROM
			         (SELECT SRU.RECV_ID
		               FROM SNS_MESSAGE SM, SNS_SCHEDULE_MESSAGE SSM, SNS_RECV_USER SRU
		                  , SNS_USER_CLIENT SUC, SNS_CLIENT SC
		              WHERE SM.MSG_ID       = SSM.SCHDL_MSG_ID
		                AND SM.MSG_ID       = SRU.MSG_ID
		                AND SRU.USR_ID      = SUC.USR_ID
		                AND SUC.CLIENT_ID   = SC.CLIENT_ID
		                AND SRU.PUSH_SND_AT = #{push_snd_at}
		                AND SC.CLIENT_TP_CD IN
		                <foreach collection="client_types" item="item" index="i" open="(" close=")" separator=",">
		                   #{item}
		                </foreach>
		                AND SUC.PUSH_TOKEN IS NOT NULL
		              ) A 
	     )
	     </if>
	     <!-- 성공여부('Y' or 'F') 변경은 건 BY 건 -->
	     <if test="@i2c.cmm.util.StringUtil@isNotEmpty(recv_id)">
	     WHERE RECV_ID = #{recv_id} <!-- 대기상태는 전체 업데이트 -->
	     </if>
	</update>	
	
	<delete id="deletePushMessageUser" parameterType="java.util.Map">
	 /* [i2c.cmm.push.dao.PushDAO.deletePushMessageUser] backgroud push 수신자목록 삭제 */
	   DELETE 
	   	 FROM SNS_RECV_USER 
	   	WHERE MSG_ID IN (
				        SELECT DISTINCT(SRU.MSG_ID)
					      FROM SNS_SCHEDULE_MESSAGE SSM
				             , SNS_RECV_USER SRU
					     WHERE 1=1             
	 					 <include refid="conditionQuery"/> 
				         )
	</delete>
    
</mapper>