package com.zioinfo.mall.uiws.schedule.mapper;

import com.zioinfo.mall.uiws.schedule.model.UiwsAttach;
import com.zioinfo.mall.uiws.schedule.model.UiwsDiary;
import com.zioinfo.mall.uiws.schedule.model.UiwsSchedule;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 일정·일지·첨부 MyBatis 매퍼. 원본 JPA ScheduleRepository/DiaryRepository/AttachRepository 변환 이식.
 * 데이터 가시범위: scopeAll(true=ADMIN 전체) OR owner IN (ownerIds). ownerIds 는 항상 본인 포함(빈 IN 회피).
 */
@Mapper
public interface ScheduleMapper {

    // ── schedule
    int insertSchedule(UiwsSchedule s);

    int updateSchedule(UiwsSchedule s);

    UiwsSchedule findScheduleById(@Param("scheduleId") Long scheduleId);

    boolean existsScheduleById(@Param("scheduleId") Long scheduleId);

    int deleteScheduleById(@Param("scheduleId") Long scheduleId);

    /** 달력: 기간 겹침([from,to) 배타 상한) + type + 개인소유/부서필터. */
    List<UiwsSchedule> findInRange(@Param("from") LocalDateTime from,
                                   @Param("to") LocalDateTime to,
                                   @Param("scheType") String scheType,
                                   @Param("ownerId") String ownerId,
                                   @Param("deptId") String deptId);

    List<UiwsSchedule> searchAll(@Param("from") LocalDateTime from,
                                 @Param("to") LocalDateTime to,
                                 @Param("scheType") String scheType,
                                 @Param("scopeAll") boolean scopeAll,
                                 @Param("ownerIds") List<String> ownerIds,
                                 @Param("limit") int limit,
                                 @Param("offset") int offset);

    long countAll(@Param("from") LocalDateTime from,
                  @Param("to") LocalDateTime to,
                  @Param("scheType") String scheType,
                  @Param("scopeAll") boolean scopeAll,
                  @Param("ownerIds") List<String> ownerIds);

    List<UiwsSchedule> searchPopup(@Param("keyword") String keyword,
                                   @Param("scopeAll") boolean scopeAll,
                                   @Param("ownerIds") List<String> ownerIds);

    // ── diary
    int insertDiary(UiwsDiary d);

    int updateDiary(UiwsDiary d);

    UiwsDiary findDiaryById(@Param("diaryId") Long diaryId);

    boolean existsDiaryById(@Param("diaryId") Long diaryId);

    int deleteDiaryById(@Param("diaryId") Long diaryId);

    List<UiwsDiary> searchDiary(@Param("from") LocalDate from,
                                @Param("to") LocalDate to,
                                @Param("limit") int limit,
                                @Param("offset") int offset);

    long countDiary(@Param("from") LocalDate from, @Param("to") LocalDate to);

    // ── attach
    int insertAttach(UiwsAttach a);

    UiwsAttach findAttachById(@Param("attachId") Long attachId);

    int updateAttachRef(@Param("attachId") Long attachId,
                        @Param("refType") String refType,
                        @Param("refId") Long refId,
                        @Param("actor") String actor);

    List<UiwsAttach> findAttachByRef(@Param("refType") String refType, @Param("refId") Long refId);

    int deleteAttachById(@Param("attachId") Long attachId);

    int deleteAttachByRef(@Param("refType") String refType, @Param("refId") Long refId);

    // ── 사용자명 라벨(코어 user 재사용)
    List<Map<String, String>> findUserNames(@Param("ids") List<String> ids);
}
