package kr.itn.itnhub.project;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ProjectMapper {

    /** 기관별 연락이력 건수·최근 연락일·보고서 건수. 사업관리 목록에 붙일 값만 모아 한 번에 읽는다. */
    List<ProjectSideInfo> findSideInfo();

    List<ContactLog> findLogsByOrg(@Param("orgId") Long orgId);

    int insertLog(@Param("orgId") Long orgId, @Param("contactedOn") String contactedOn,
                  @Param("method") String method, @Param("summary") String summary,
                  @Param("author") String author);

    int updateLog(@Param("orgId") Long orgId, @Param("id") Long id,
                  @Param("contactedOn") String contactedOn, @Param("method") String method,
                  @Param("summary") String summary);

    int deleteLog(@Param("orgId") Long orgId, @Param("id") Long id);

    List<OrgReport> findReportsByOrg(@Param("orgId") Long orgId);

    int insertReport(@Param("orgId") Long orgId, @Param("fileName") String fileName,
                     @Param("contentType") String contentType, @Param("byteSize") long byteSize,
                     @Param("content") byte[] content, @Param("uploadedBy") String uploadedBy);

    /** 보고서 교체(요구사항 [25]). 새 행을 만들지 않고 같은 자리를 덮어쓴다. */
    int updateReport(@Param("orgId") Long orgId, @Param("id") Long id,
                     @Param("fileName") String fileName,
                     @Param("contentType") String contentType, @Param("byteSize") long byteSize,
                     @Param("content") byte[] content, @Param("uploadedBy") String uploadedBy);

    /** 다운로드용. 파일 내용까지 읽는다. */
    ReportContent findReportContent(@Param("orgId") Long orgId, @Param("id") Long id);

    int deleteReport(@Param("orgId") Long orgId, @Param("id") Long id);

    /** @param lastContactedOn 연락 이력이 없으면 null */
    record ProjectSideInfo(Long orgId, String lastContactedOn, int contactCount, int reportCount) {
    }

    record ReportContent(String fileName, String contentType, byte[] content) {
    }
}
