package shop.alien.store.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.StoreStaffReview;
import shop.alien.entity.store.dto.StoreStaffReviewDto;
import shop.alien.entity.store.vo.StoreStaffReviewDetailVo;
import shop.alien.entity.store.vo.StoreStaffReviewListWithStaffVo;
import shop.alien.entity.store.vo.StoreStaffReviewStatisticsVo;
import shop.alien.entity.store.vo.StoreStaffReviewVo;

/**
 * 员工评价 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface StoreStaffReviewService extends IService<StoreStaffReview> {

    /**
     * 创建员工评价
     *
     * @param reviewDto 评价DTO
     * @return R<StoreStaffReview>
     */
    R<StoreStaffReview> createReview(StoreStaffReviewDto reviewDto);

    /**
     * 获取评价详情（包含评论和回复）
     *
     * @param reviewId 评价ID
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @param longitude 用户经度（用于计算距离，可为null）
     * @param latitude 用户纬度（用于计算距离，可为null）
     * @return R<StoreStaffReviewDetailVo>
     */
    R<StoreStaffReviewDetailVo> getReviewDetail(Integer reviewId, Integer currentUserId, Double longitude, Double latitude);

    /**
     * 点赞评价
     *
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return R<Boolean>
     */
    R<Boolean> likeReview(Integer reviewId, Integer userId);

    /**
     * 取消点赞评价
     *
     * @param reviewId 评价ID
     * @param userId 用户ID
     * @return R<Boolean>
     */
    R<Boolean> cancelLikeReview(Integer reviewId, Integer userId);

    /**
     * 分页查询评价列表
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param staffUserId 员工用户ID（可选）
     * @param userId 评价用户ID（可选）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<IPage<StoreStaffReviewVo>>
     */
    R<IPage<StoreStaffReviewVo>> getReviewList(int pageNum, int pageSize, Integer staffUserId, Integer userId, Integer currentUserId);

    /**
     * 用户删除评价（只能删除自己的评价，删除评价时，会级联删除该评价下的所有评论和回复）
     *
     * @param reviewId 评价ID
     * @param userId 用户ID（必填，只能删除自己的评价）
     * @return R<Boolean>
     */
    R<Boolean> deleteReview(Integer reviewId, Integer userId);

    /**
     * 管理员删除评价（可以删除任何评价，删除评价时，会级联删除该评价下的所有评论和回复）
     *
     * @param reviewId 评价ID
     * @return R<Boolean>
     */
    R<Boolean> deleteReviewByAdmin(Integer reviewId);

    /**
     * 根据人员ID查询评价列表（包含人员信息）
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param staffUserId 员工用户ID（必填）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<StoreStaffReviewListWithStaffVo>
     */
    R<StoreStaffReviewListWithStaffVo> getReviewListByStaffId(int pageNum, int pageSize, Integer staffUserId, Integer currentUserId);

    /**
     * 获取员工评价统计数据
     *
     * @param staffUserId 员工用户ID
     * @return R<StoreStaffReviewStatisticsVo>
     */
    R<StoreStaffReviewStatisticsVo> getStaffReviewStatistics(Integer staffUserId);

    /**
     * 根据员工ID和类型分页查询评价列表（不包含评论）
     *
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param staffUserId 员工用户ID
     * @param type 查询分类（1：好评，2：中评，3：差评，4：有图，为空时返回全部）
     * @param currentUserId 当前用户ID（用于判断是否已点赞，可为null）
     * @return R<IPage<StoreStaffReviewVo>>
     */
    R<IPage<StoreStaffReviewVo>> getReviewListByStaffAndType(int pageNum, int pageSize, Integer staffUserId, Integer type, Integer currentUserId);
}

