<?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.project.ProjectMapper">

  <!--
    사업관리 목록에 붙일 값만 기관별로 한 번에 센다. 기관 현황 본체는 DashboardMapper가
    이미 만들어 주므로 여기서 다시 조회하지 않는다(같은 숫자를 두 곳에서 세지 않기 위함).
  -->
  <select id="findSideInfo" resultType="kr.itn.itnhub.project.ProjectMapper$ProjectSideInfo">
    select
      o.id as org_id,
      to_char(cl.last_on, 'YYYY-MM-DD') as last_contacted_on,
      coalesce(cl.cnt, 0) as contact_count,
      coalesce(rp.cnt, 0) as report_count
    from organization o
    left join (
      select org_id, max(contacted_on) as last_on, count(*) as cnt
      from contact_log group by org_id
    ) cl on cl.org_id = o.id
    left join (
      select org_id, count(*) as cnt from org_report group by org_id
    ) rp on rp.org_id = o.id
  </select>

  <!-- 연락 이력: 최근 연락일 순. 같은 날짜면 나중에 넣은 것이 위로 온다. -->
  <select id="findLogsByOrg" resultType="kr.itn.itnhub.project.ContactLog">
    select id, org_id,
           to_char(contacted_on, 'YYYY-MM-DD') as contacted_on,
           method, summary, author,
           (extract(epoch from created_at) * 1000)::bigint as created_at
    from contact_log
    where org_id = #{orgId}
    order by contacted_on desc, id desc
  </select>

  <insert id="insertLog">
    insert into contact_log (org_id, contacted_on, method, summary, author)
    values (#{orgId}, cast(#{contactedOn} as date), #{method}, #{summary}, #{author})
  </insert>

  <!-- 작성자는 처음 남긴 사람을 유지한다(업무메모와 같은 규칙). -->
  <update id="updateLog">
    update contact_log set
      contacted_on = cast(#{contactedOn} as date),
      method       = #{method},
      summary      = #{summary}
    where id = #{id} and org_id = #{orgId}
  </update>

  <delete id="deleteLog">
    delete from contact_log where id = #{id} and org_id = #{orgId}
  </delete>

  <select id="findReportsByOrg" resultType="kr.itn.itnhub.project.OrgReport">
    select id, org_id, file_name, content_type, byte_size, uploaded_by,
           (extract(epoch from uploaded_at) * 1000)::bigint as uploaded_at
    from org_report
    where org_id = #{orgId}
    order by uploaded_at desc, id desc
  </select>

  <insert id="insertReport">
    insert into org_report (org_id, file_name, content_type, byte_size, content, uploaded_by)
    values (#{orgId}, #{fileName}, #{contentType}, #{byteSize}, #{content}, #{uploadedBy})
  </insert>

  <select id="findReportContent" resultType="kr.itn.itnhub.project.ProjectMapper$ReportContent">
    select file_name, content_type, content
    from org_report
    where id = #{id} and org_id = #{orgId}
  </select>

  <!--
    보고서 교체(요구사항 [25]). 같은 자리에 새 파일을 덮어쓰고 올린 사람·시각을 갱신한다.
    새 행을 만들지 않는 이유는 "고쳐 올리기"가 개정판 쌓기와 다른 동작이기 때문이다 -
    개정판으로 남기고 싶으면 지금처럼 새로 올리면 된다.
  -->
  <update id="updateReport">
    update org_report set
      file_name    = #{fileName},
      content_type = #{contentType},
      byte_size    = #{byteSize},
      content      = #{content},
      uploaded_by  = #{uploadedBy},
      uploaded_at  = now()
    where id = #{id} and org_id = #{orgId}
  </update>

  <delete id="deleteReport">
    delete from org_report where id = #{id} and org_id = #{orgId}
  </delete>

</mapper>
