<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.itn.itnhub.review.ReviewItemMapper">

  <!--
    web_edited_at/created_at/updated_at을 밀리초 epoch로 내려준다(work_memo와 동일 관례).
    web_edited_at은 null이면 extract(epoch from null)도 null이라 그대로 null이 내려간다.
  -->
  <sql id="columns">
    id, org_id, seq, site_name, category, board_path, board_name, post_title, url,
    post_registered, produced_date, published_date, has_attachment, kogl_attached, kogl_type, ai_type,
    surveyor_note, openable, review_major, review_minor, review_result, judged_kogl_type, judged_ai_type,
    opinion, lawyer_note, needs_processing,
    (extract(epoch from web_edited_at) * 1000)::bigint as web_edited_at,
    (extract(epoch from created_at) * 1000)::bigint as created_at,
    (extract(epoch from updated_at) * 1000)::bigint as updated_at
  </sql>

  <sql id="keywordFilter">
    <if test="keyword != null">
      and (site_name ilike concat('%', #{keyword}, '%')
        or board_name ilike concat('%', #{keyword}, '%')
        or post_title ilike concat('%', #{keyword}, '%'))
    </if>
  </sql>

  <select id="findPage" resultType="kr.itn.itnhub.review.ReviewItem">
    select <include refid="columns"/>
    from review_item
    where org_id = #{orgId}
    <include refid="keywordFilter"/>
    order by seq asc
    limit #{limit} offset #{offset}
  </select>

  <select id="countByOrg" resultType="int">
    select count(*)
    from review_item
    where org_id = #{orgId}
    <include refid="keywordFilter"/>
  </select>

  <select id="countDone" resultType="int">
    select count(*)
    from review_item
    where org_id = #{orgId}
      and review_result is not null
      and review_result &lt;&gt; ''
  </select>

  <select id="findAllByOrg" resultType="kr.itn.itnhub.review.ReviewItem">
    select <include refid="columns"/>
    from review_item
    where org_id = #{orgId}
    order by seq asc
  </select>

  <select id="findSeqsByOrg" resultType="int">
    select seq from review_item where org_id = #{orgId}
  </select>

  <select id="findById" resultType="kr.itn.itnhub.review.ReviewItem">
    select <include refid="columns"/>
    from review_item
    where org_id = #{orgId} and id = #{id}
  </select>

  <!--
    정책(b): 조사원 영역(site_name..surveyor_note)은 재업로드마다 항상 최신 파일값으로
    덮어쓴다. 변호사 영역(openable..needs_processing)은 web_edited_at이 null일 때만
    (=웹에서 아직 아무도 손대지 않았을 때만) 파일값을 반영한다 - 이미 웹에서 판정을
    입력한 행은 재업로드가 절대 덮어쓰지 않는다.
  -->
  <insert id="upsertFromFile" parameterType="kr.itn.itnhub.review.ReviewItem">
    insert into review_item (
      org_id, seq, site_name, category, board_path, board_name, post_title, url,
      post_registered, produced_date, published_date, has_attachment, kogl_attached, kogl_type, ai_type,
      surveyor_note, openable, review_major, review_minor, review_result, judged_kogl_type, judged_ai_type,
      opinion, lawyer_note, needs_processing
    ) values (
      #{orgId}, #{seq}, #{siteName}, #{category}, #{boardPath}, #{boardName}, #{postTitle}, #{url},
      #{postRegistered}, #{producedDate}, #{publishedDate}, #{hasAttachment}, #{koglAttached}, #{koglType}, #{aiType},
      #{surveyorNote}, #{openable}, #{reviewMajor}, #{reviewMinor}, #{reviewResult}, #{judgedKoglType}, #{judgedAiType},
      #{opinion}, #{lawyerNote}, #{needsProcessing}
    )
    on conflict (org_id, seq) do update set
      site_name       = excluded.site_name,
      category        = excluded.category,
      board_path      = excluded.board_path,
      board_name      = excluded.board_name,
      post_title      = excluded.post_title,
      url             = excluded.url,
      post_registered = excluded.post_registered,
      produced_date   = excluded.produced_date,
      published_date  = excluded.published_date,
      has_attachment  = excluded.has_attachment,
      kogl_attached   = excluded.kogl_attached,
      kogl_type       = excluded.kogl_type,
      ai_type         = excluded.ai_type,
      surveyor_note   = excluded.surveyor_note,
      openable        = case when review_item.web_edited_at is null then excluded.openable else review_item.openable end,
      review_major    = case when review_item.web_edited_at is null then excluded.review_major else review_item.review_major end,
      review_minor    = case when review_item.web_edited_at is null then excluded.review_minor else review_item.review_minor end,
      review_result   = case when review_item.web_edited_at is null then excluded.review_result else review_item.review_result end,
      judged_kogl_type = case when review_item.web_edited_at is null then excluded.judged_kogl_type else review_item.judged_kogl_type end,
      judged_ai_type  = case when review_item.web_edited_at is null then excluded.judged_ai_type else review_item.judged_ai_type end,
      opinion         = case when review_item.web_edited_at is null then excluded.opinion else review_item.opinion end,
      lawyer_note     = case when review_item.web_edited_at is null then excluded.lawyer_note else review_item.lawyer_note end,
      needs_processing = case when review_item.web_edited_at is null then excluded.needs_processing else review_item.needs_processing end,
      updated_at      = now()
  </insert>

  <update id="updateJudgment">
    update review_item set
      openable          = #{openable},
      review_major      = #{reviewMajor},
      review_minor      = #{reviewMinor},
      review_result     = #{reviewResult},
      judged_kogl_type  = #{judgedKoglType},
      judged_ai_type    = #{judgedAiType},
      opinion           = #{opinion},
      lawyer_note       = #{lawyerNote},
      needs_processing  = #{needsProcessing},
      web_edited_at     = now(),
      updated_at        = now()
    where org_id = #{orgId} and id = #{id}
  </update>

  <delete id="deleteById">
    delete from review_item where org_id = #{orgId} and id = #{id}
  </delete>

  <delete id="deleteByOrg">
    delete from review_item where org_id = #{orgId}
  </delete>

</mapper>
