package incheon.ags.mrb.share.service;

import incheon.ags.mrb.share.vo.RecipeShrnDtlVO;
import incheon.ags.mrb.share.vo.RecipeShrnVO;
import incheon.ags.mrb.share.web.dto.RecipeShareDTO;
import incheon.ags.mrb.share.web.dto.ShareTargetDTO;
import incheon.com.security.vo.LoginVO;

import java.util.List;
import java.util.Map;

/**
 * 레시피 공유 서비스 인터페이스
 * - 레시피 공유 요청 및 승인 관리
 */
public interface RecipeShrnService {

    /**
     * 레시피 공유 목록 조회
     * @param recipeShrnVO 검색 조건
     * @return 레시피 공유 목록과 페이징 정보
     * @throws Exception
     */
    Map<String, Object> getRecipeShrnList(RecipeShrnVO recipeShrnVO) throws Exception;

    /**
     * 레시피 공유 상세 조회
     * @param shrnId 공유 ID
     * @return 레시피 공유 상세 정보
     * @throws Exception
     */
    RecipeShrnVO getRecipeShrnDetail(Integer shrnId) throws Exception;

    /**
     * 레시피 공유 승인 상태 수정
     * @param shrnId 공유 ID
     * @param aprvStts 승인 상태 (P:대기, S:승인, R:거부)
     * @throws Exception
     */
    void updateRecipeShrnStatus(Integer shrnId, String aprvStts) throws Exception;

    /**
     * 레시피 공유 요청 삭제
     * @param recipeId 레시피 ID
     * @param loginUser 로그인 사용자 정보
     * @param shareId 공유 ID
     * @throws Exception
     */
    void deleteRecipeShrn(Integer recipeId, LoginVO loginUser, Integer shareId) throws Exception;

    /**
     * 레시피별 공유 요청 삭제 (레시피 삭제 시)
     * @param recipeId 레시피 ID
     * @throws Exception
     */
    void deleteRecipeShrnByRecipeId(Integer recipeId) throws Exception;

    /**
     * 레시피 공유 요청 중복 확인
     * @param recipeId 레시피 ID
     * @return 중복 여부 (true: 중복됨, false: 가능)
     * @throws Exception
     */
    boolean checkRecipeShrnExists(Integer recipeId) throws Exception;

    // ========================================
    // 공유 대상 관련 메서드
    // ========================================

    /**
     * 공유 ID별 공유 대상 목록 조회
     * @param shrnId 공유 ID
     * @return 공유 대상 목록
     * @throws Exception
     */
    List<RecipeShrnDtlVO> getRecipeShrnDtlListByShrnId(Integer shrnId) throws Exception;

    /**
     * 레시피 ID별 공유 대상 목록 조회
     * @param recipeId 레시피 ID
     * @return 공유 대상 목록
     * @throws Exception
     */
    List<RecipeShrnDtlVO> getRecipeShrnDtlListByRecipeId(Integer recipeId) throws Exception;

    /**
     * 레시피 공유 대상 추가
     * @param recipeShrnDtlVO 레시피 공유 대상 정보
     * @throws Exception
     */
    void addRecipeShrnDtl(RecipeShrnDtlVO recipeShrnDtlVO) throws Exception;

    /**
     * 레시피 공유 대상 일괄 추가
     * @param recipeShrnDtlList 레시피 공유 대상 목록
     * @throws Exception
     */
    void addRecipeShrnDtlList(List<RecipeShrnDtlVO> recipeShrnDtlList) throws Exception;

    /**
     * 레시피 공유 대상 삭제
     * @param shrnId 공유 ID
     * @param mporEn 가져오기 여부
     * @param shrnTrgtId 공유 대상 ID
     * @throws Exception
     */
    void deleteRecipeShrnDtl(Integer shrnId, String mporEn, String shrnTrgtId) throws Exception;

    /**
     * 공유 ID별 공유 대상 전체 삭제
     * @param shrnId 공유 ID
     * @throws Exception
     */
    void deleteRecipeShrnDtlByShrnId(Integer shrnId) throws Exception;

    // ========================================
    // DTO 기반 편의 메서드
    // ========================================

    /**
     * 레시피 공유 신청 생성 (DTO 기반)
     * @param recipeId 레시피 ID
     * @param shareTargets 공유 대상 목록
     * @param loginUser 로그인 사용자 정보
     * @return 생성된 공유 ID
     * @throws Exception
     */
    Integer createShareRequest(Integer recipeId, List<ShareTargetDTO> shareTargets, LoginVO loginUser) throws Exception;

    /**
     * 레시피 공유 신청 처리 현황 조회 (DTO 기반)
     * @param recipeId 레시피 ID
     * @param loginUser 로그인 사용자 정보
     * @return 공유 신청 처리 현황 목록
     * @throws Exception
     */
    List<RecipeShareDTO> getShareStatusList(Integer recipeId, LoginVO loginUser) throws Exception;

    /**
     * 레시피 공유 상세 정보 조회 (DTO 기반)
     * @param shareId 공유 ID
     * @return 공유 상세 정보
     * @throws Exception
     */
    RecipeShareDTO getShareDetail(Integer shareId) throws Exception;

    /**
     * 공유받은 레시피 목록 조회 (페이징 포함)
     * @param userId 사용자 ID
     * @param searchCondition 검색 조건 (0:레시피명, 1:설명, 2:작성자)
     * @param searchKeyword 검색 키워드
     * @param recipeClsfCd 레시피 분류코드 (A:일반, B:전문, C:분석용)
     * @param pageIndex 페이지 번호
     * @param recordCountPerPage 페이지당 건수
     * @return 공유받은 레시피 목록과 페이징 정보
     * @throws Exception
     */
    Map<String, Object> getSharedRecipes(String userId, String searchCondition, String searchKeyword, String recipeClsfCd, Integer pageIndex, Integer recordCountPerPage) throws Exception;

    /**
     * 관리자용 공유 승인 대기 목록 조회
     * @param searchCondition 검색 조건
     * @param searchKeyword 검색 키워드
     * @param recipeClsfCd 레시피 분류코드 (A:일반, B:전문, C:분석용)
     * @param pageIndex 페이지 번호
     * @param recordCountPerPage 페이지당 건수
     * @param requestUserId 요청 사용자 ID (로그용)
     * @return 승인 대기 목록과 페이징 정보
     * @throws Exception
     */
    Map<String, Object> getApprovalRequests(String searchCondition, String searchKeyword, String recipeClsfCd, Integer pageIndex, Integer recordCountPerPage, String requestUserId) throws Exception;

    /**
     * 공유 승인 처리 (검증 포함)
     * @param shareId 공유 ID
     * @param requestUserId 요청 사용자 ID (로그용)
     * @throws Exception
     */
    void approveShare(Integer shareId, String requestUserId) throws Exception;

    /**
     * 공유 거부 처리 (검증 포함)
     * @param shareId 공유 ID
     * @param requestUserId 요청 사용자 ID (로그용)
     * @throws Exception
     */
    void rejectShare(Integer shareId, String requestUserId) throws Exception;
}
