<?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.MSG_CNTN
             , SC.CLIENT_TP_CD
             <!-- , (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 SYSDATE - TO_DATE(SM.CRT_DTTM, 'YYYY-MM-DD HH24:MI:SS') > 1 
			        THEN 'FAIL' 
			        ELSE 'SUCC' 
			        END SEND_FLAG /* FAIL 이면 전송하지 않고 전송FAIL 처리 */ 
          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 = TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')
             , PUSH_SNDR_ID  = #{push_sndr_id}
	       </if>	       
	     <!-- 대기상태('D') 변경은 전체 업데이트 -->
	     <if test="@i2c.cmm.util.StringUtil@isEmpty(recv_id)">
	     WHERE RECV_ID IN (
	         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 
	     )
	     </if>
	     <!-- 성공여부('Y' or 'F') 변경은 건 BY 건 -->
	     <if test="@i2c.cmm.util.StringUtil@isNotEmpty(recv_id)">
	     WHERE RECV_ID = #{recv_id} <!-- 대기상태는 전체 업데이트 -->
	     </if>
	</update>
	
	<delete id="deletePushMessageUserHist" parameterType="java.util.Map">
	 /* [i2c.cmm.push.dao.PushDAO.deletePushMessageUserHist] backgroud push 수신자목록 백업 동일건 삭제 */
	   DELETE 
	   	 FROM HIST_SNS_RECV_USER 
	   	WHERE RECV_ID IN (
				        SELECT DISTINCT(SRU.RECV_ID)
					      FROM SNS_SCHEDULE_MESSAGE SSM
				             , SNS_RECV_USER SRU
					     WHERE 1=1             
	 					 <include refid="conditionQuery"/>
				         )
	</delete>
	
	<update id="insertPushMessageUserHist" parameterType="java.util.Map">
	    /* [i2c.cmm.push.dao.PushDAO.insertPushMessageUserHist] backgroud push 수신자목록 백업 */
	INSERT INTO HIST_SNS_RECV_USER (
	      RECV_ID       
	    , MSG_ID               
	    , USR_ID              
	    , CONFIRM_DTTM          
	    , PUSH_SND_AT           
	    , PUSH_SND_DTTM          
	    , PUSH_SNDR_ID     
	)               
	SELECT 
	       SRU.RECV_ID       
	     , SRU.MSG_ID               
	     , SRU.USR_ID              
	     , SRU.CONFIRM_DTTM          
	     , SRU.PUSH_SND_AT           
	     , SRU.PUSH_SND_DTTM          
	     , SRU.PUSH_SNDR_ID           
	  FROM SNS_SCHEDULE_MESSAGE SSM                  
	     , SNS_RECV_USER SRU          
	 WHERE 1=1             
	 <include refid="conditionQuery"/>
	</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>