<?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="comment">
    <resultMap type="CommentVo" id="commentResult">
        <result column="BOARD_ID" property="boardId" />
        <result column="BOARD_NAME" property="boardName" />
        <result column="ARTICLE_SEQ" property="articleSeq" />
        <result column="SEQ" property="seq" />
        <result column="CONTENT" property="content" />
        <result column="REGISTER_DATE" property="registerDate" />
        <result column="GOOD" property="good" />
        <result column="BAD" property="bad" />
        <result column="WRITER_ID" property="writerId" />
        <result column="WRITER_NAME" property="writerName" />
        <result column="WRITER_DISPLAY_ID" property="writerDisplayId" />
        <result column="WRITER_PROFILE_IMG_URL" property="writerProfileImgUrl" />
        <result column="PARENT_WRITER_ID" property="parentWriterId" />
        <result column="PARENT_WRITER_NAME" property="parentWriterName" />
        <result column="PARENT_WRITER_DISPLAY_ID" property="parentWriterDisplayId" />
        <result column="GROUP_ID" property="groupId" />
        <result column="PARENT_SEQ" property="parentSeq" />
        <result column="STATUS" property="status" />
        <result column="PASSWORD" property="password" />
    </resultMap>

    <select id="getNextSeq" parameterType="CommentVo" resultType="String">
		SELECT
			CASE
				WHEN MAX(SEQ) IS NULL THEN 0
				ELSE MAX(SEQ) + 1
			END as SEQ
		FROM
			IMB_COMMENT
		WHERE BOARD_ID = #{boardId} AND ARTICLE_SEQ = #{articleSeq}
    </select>

    <select id="getCommentListCount" parameterType="CommentVo" resultType="String">
        SELECT
        	COUNT(IMBOARD_ID) AS COUNT
        FROM
        	IMB_COMMENT
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	<if test="#{content}">
            	AND CONTENT LIKE CONCAT('%',#{content},'%')
        	</if>
        	<if test="#{writerId}">
        		AND A.WRITER_ID = #{writerId}
        	</if>
        	<if test="#{likeWriterId}">
        		AND A.WRITER_ID LIKE CONCAT('%',#{likeWriterId},'%')
        	</if>
        	<if test="#{writerName}">
        		AND A.WRITER_NAME = #{writerName}
        	</if>
        	<if test="#{likeWriterName}">
        		AND A.WRITER_NAME LIKE CONCAT('%',#{likeWriterName},'%')
        	</if>
        	<if test="#{writerDisplayId}">
        		AND B.DISPLAY_ID = #{writerDisplayId}
        	</if>
        	<if test="#{likeWriterDisplayId}">
        		AND B.DISPLAY_ID LIKE CONCAT('%',#{likeWriterDisplayId},'%')
        	</if>
        ORDER BY
        	GROUP_ID <choose><when test="#{orderByGroupId}">${orderByGroupId}</when><otherwise>ASC</otherwise></choose>
       		,SEQ <choose><when test="#{orderBySeq}">${orderBySeq}</when><otherwise>ASC</otherwise></choose>
       		<if test="#{orderByRegisterDate}">, REGISTER_DATE ${orderByRegisterDate}</if>
     	<if test="startIndex">
        	<if test="endIndex">
        		LIMIT #{startIndex}, #{endIndex}
        	</if>
        </if>
    </select>

    <select id="getCommentList" parameterType="CommentVo" resultMap="commentResult">
        SELECT
        	A.BOARD_ID,
        	A.ARTICLE_SEQ,
        	A.SEQ,
        	A.CONTENT,
        	<choose>
        	    <when test="!#{registerDateType} or #{registerDateType} == 'short'">
        	        (
			        	CASE
			        		WHEN DATE_FORMAT(now(), '%Y-%m-%d') = DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d') THEN DATE_FORMAT(A.REGISTER_DATE, '%H:%i:%s')
			        		ELSE DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d')
			        	END
		        	) AS REGISTER_DATE,
        	    </when>
        	    <when test="#{registerDateType} == 'long'">
        	        DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d %H:%i:%s') AS REGISTER_DATE,
        	    </when>
        	</choose>
        	A.GOOD,
        	A.BAD,
        	A.WRITER_ID,
        	CASE
        		WHEN B.NAME IS NULL THEN A.WRITER_NAME
        		ELSE B.NAME
        	END AS WRITER_NAME,
        	B.DISPLAY_ID AS WRITER_DISPLAY_ID,
        	A.PARENT_WRITER_ID,
        	C.ID AS PARENT_WRITER_ID,
        	CASE
        		WHEN C.NAME IS NULL THEN A.PARENT_WRITER_NAME
        		ELSE C.NAME
        	END AS PARENT_WRITER_NAME,
        	C.DISPLAY_ID AS PARENT_WRITER_DISPLAY_ID,
        	B.PROFILE_IMG_URL AS WRITER_PROFILE_IMG_URL,
        	A.PARENT_SEQ,
        	A.GROUP_ID,
        	A.STATUS,
        	'' AS PASSWORD
        FROM
        	IMB_COMMENT AS A LEFT OUTER JOIN IMB_USER B ON A.WRITER_ID = B.ID
        	LEFT OUTER JOIN IMB_USER C ON A.PARENT_WRITER_ID = C.ID
        WHERE
        		A.BOARD_ID = #{boardId}
        	AND A.ARTICLE_SEQ = #{articleSeq}
        	<if test="#{content}">
            	AND CONTENT LIKE CONCAT('%',#{content},'%')
        	</if>
        	<if test="#{writerId}">
        		AND A.WRITER_ID = #{writerId}
        	</if>
        	<if test="#{likeWriterId}">
        		AND A.WRITER_ID LIKE CONCAT('%',#{likeWriterId},'%')
        	</if>
        	<if test="#{writerName}">
        		AND A.WRITER_NAME = #{writerName}
        	</if>
        	<if test="#{likeWriterName}">
        		AND A.WRITER_NAME LIKE CONCAT('%',#{likeWriterName},'%')
        	</if>
        	<if test="#{writerDisplayId}">
        		AND B.DISPLAY_ID = #{writerDisplayId}
        	</if>
        	<if test="#{likeWriterDisplayId}">
        		AND B.DISPLAY_ID LIKE CONCAT('%',#{likeWriterDisplayId},'%')
        	</if>
        ORDER BY
        	GROUP_ID <choose><when test="#{orderByGroupId}">${orderByGroupId}</when><otherwise>ASC</otherwise></choose>
       		,SEQ <choose><when test="#{orderBySeq}">${orderBySeq}</when><otherwise>ASC</otherwise></choose>
       		<if test="#{orderByRegisterDate}">, REGISTER_DATE ${orderByRegisterDate}</if>
     	<if test="#{startIndex} and #{endIndex}">
       		LIMIT #{startIndex}, #{endIndex}
        </if>
    </select>

    <select id="getComment" parameterType="CommentVo" resultMap="commentResult">
        SELECT
        	A.BOARD_ID,
        	A.ARTICLE_SEQ,
        	A.SEQ,
        	A.CONTENT,
        	<choose>
        	    <when test="!#{registerDateType} or #{registerDateType} == 'short'">
        	        (
			        	CASE
			        		WHEN DATE_FORMAT(now(), '%Y-%m-%d') = DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d') THEN DATE_FORMAT(A.REGISTER_DATE, '%H:%i:%s')
			        		ELSE DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d')
			        	END
		        	) AS REGISTER_DATE,
        	    </when>
        	    <when test="#{registerDateType} == 'long'">
        	        DATE_FORMAT(A.REGISTER_DATE, '%Y-%m-%d %H:%i:%s') AS REGISTER_DATE,
        	    </when>
        	</choose>
        	A.GOOD,
        	A.BAD,
        	A.WRITER_ID,
        	CASE
        		WHEN B.NAME IS NULL THEN A.WRITER_NAME
        		ELSE B.NAME
        	END AS WRITER_NAME,
        	B.DISPLAY_ID AS WRITER_DISPLAY_ID,
        	A.PARENT_WRITER_ID,
        	C.ID AS PARENT_WRITER_ID,
        	CASE
        		WHEN C.NAME IS NULL THEN A.PARENT_WRITER_NAME
        		ELSE C.NAME
        	END AS PARENT_WRITER_NAME,
        	C.DISPLAY_ID AS PARENT_WRITER_DISPLAY_ID,
        	B.PROFILE_IMG_URL AS WRITER_PROFILE_IMG_URL,
        	A.PARENT_SEQ,
        	A.GROUP_ID,
        	A.STATUS,
        	A.PASSWORD
        FROM
        	IMB_COMMENT AS A LEFT OUTER JOIN IMB_USER B ON A.WRITER_ID = B.ID
        	LEFT OUTER JOIN IMB_USER C ON A.PARENT_WRITER_ID = C.ID
        WHERE
        		A.BOARD_ID = #{boardId}
        	AND A.ARTICLE_SEQ = #{articleSeq}
        	AND A.SEQ = #{seq}
        ORDER BY
        	A.GROUP_ID, A.SEQ
    </select>

    <insert id="insertComment" parameterType="CommentVo">
        INSERT INTO	IMB_COMMENT
        	(BOARD_ID, ARTICLE_SEQ, SEQ, CONTENT, WRITER_ID, WRITER_NAME, GROUP_ID, PARENT_SEQ, PARENT_WRITER_ID, PARENT_WRITER_NAME, PASSWORD)
        VALUES
        	(
        		#{boardId},
        		#{articleSeq},
        		#{seq},
        		#{content},
        		#{writerId},
        		#{writerName},
        		<choose>
        		    <when test="#{groupId}">
        		        #{groupId}
        		    </when>
        		    <otherwise>
		       			#{seq}
        		    </otherwise>
        		</choose>,
        		#{parentSeq},
        		#{parentWriterId},
        		#{parentWriterName},
        		#{password}
        	)
    </insert>

    <update id="updateComment" parameterType="CommentVo">
        UPDATE IMB_COMMENT SET
        	CONTENT = #{content},
        	REGISTER_DATE = CURRENT_TIMESTAMP
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	AND SEQ = #{seq}
    </update>

    <update id="updateGood" parameterType="CommentVo">
        UPDATE IMB_COMMENT SET
        	GOOD = GOOD + 1
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	AND SEQ = #{seq}
    </update>

    <update id="updateBad" parameterType="CommentVo">
        UPDATE IMB_COMMENT SET
        	BAD = BAD + 1
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	AND SEQ = #{seq}
    </update>

    <update id="updateCommentStatus" parameterType="CommentVo">
        UPDATE IMB_COMMENT SET
        	STATUS = #{status}
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	AND SEQ = #{seq}
    </update>

    <delete id="deleteComment" parameterType="CommentVo">
        DELETE FROM
        	IMB_COMMENT
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
        	AND SEQ = #{seq}
    </delete>

    <delete id="deleteCommentByArticle" parameterType="CommentVo">
        DELETE FROM
        	IMB_COMMENT
        WHERE
        		BOARD_ID = #{boardId}
        	AND ARTICLE_SEQ = #{articleSeq}
    </delete>
</mapper>
