package com.ylx.moment.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylx.discover.moment.domain.dto.MomentPageDTO;
import com.ylx.discover.moment.domain.vo.MomentPageVO;
import com.ylx.moment.domain.*;
import com.ylx.massage.domain.dto.EditMomentDTO;
import com.ylx.moment.domain.dto.MomentAuditDTO;
import com.ylx.moment.domain.dto.MomentManageQueryDTO;
import com.ylx.massage.domain.dto.PublishMomentDTO;
import com.ylx.merchant.domain.dto.MerchantMomentDTO;
import com.ylx.merchant.domain.vo.MomentVO;
import com.ylx.moment.domain.vo.*;

import java.math.BigDecimal;
import java.util.List;

/**
 * 技师动态服务接口
 */
public interface ITechnicianMomentService extends IService<TechnicianMoment> {

    /**
     * 查询推荐动态列表（不分地区，按日期倒序，同一天按浏览量倒序）
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 动态列表
     */
    List<MomentListVO> getRecommendedMoments(Integer pageNum, Integer pageSize);

    /**
     * 查询同城动态列表（按城市和发布时间倒序）
     *
     * @param cityCode 城市编码
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 动态列表
     */
    List<MomentListVO> getSameCityMoments(String cityCode, Integer pageNum, Integer pageSize);

    /**
     * 查询附近动态列表（10km内，按日期倒序，同一天按距离排序）
     *
     * @param longitude 用户经度
     * @param latitude  用户纬度
     * @param pageNum   页码
     * @param pageSize  每页数量
     * @return 动态列表
     */
    List<MomentListVO> getNearbyMoments(BigDecimal longitude, BigDecimal latitude, Integer pageNum, Integer pageSize);

    /**
     * 查询动态详情（浏览量+1）
     *
     * @param momentId 动态ID
     * @return 动态详情
     */
    MomentDetailVO getMomentDetail(Long momentId, BigDecimal longitude, BigDecimal latitude);

    /**
     * 发布动态或保存草稿
     *
     * @param dto      发布动态请求对象
     * @param openId   技师OpenID
     * @return 动态ID
     */
    Long publishMoment(PublishMomentDTO dto, String openId);

    /**
     * 编辑动态或保存为草稿
     *
     * @param dto      编辑动态请求对象
     * @param openId   技师OpenID
     * @return 动态ID
     */
    Long editMoment(EditMomentDTO dto, String openId);

    /**
     * 查询草稿箱列表
     *
     * @param openId   技师OpenID
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 草稿列表
     */
    Page<MomentListVO> getDraftMoments(String openId, Integer pageNum, Integer pageSize);

    /**
     * 查询我的动态列表（已发布的动态：审核中+审核通过）
     *
     * @param openId   技师OpenID
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 我的动态列表
     */
    Page<MyMomentVO> getMyMoments(String openId, Integer pageNum, Integer pageSize);

    /**
     * 删除我的动态。
     *
     * @param momentId 动态ID
     * @param openId   当前登录商户OpenID
     * @return 是否成功
     */
    Boolean deleteMyMoment(Long momentId, String openId);

    /**
     * 根据技师ID查询动态列表（已发布的动态：审核中+审核通过）
     *
     * @param technicianId 技师ID
     * @return List<MomentListVO> 技师的动态列表
     */
     List<MomentListVO> getMomentsByTechnicianId(String technicianId);

    /**
     * 查询待审核动态列表（管理后台）
     *
     * @param queryDTO 查询参数
     * @return Page<MomentManageVO> 分页结果
     */
    Page<MomentManageVO> getMomentManageList(MomentManageQueryDTO queryDTO);

    /**
     * 查询后台动态管理审核状态统计。
     *
     * @return MomentAuditStatusCountVO 审核状态统计
     */
    MomentAuditStatusCountVO getManageAuditStatusCount();

    /**
     * 审核动态（通过/拒绝）
     *
     * @param momentId     动态ID
     * @param auditStatus  审核状态：2-通过，3-拒绝
     * @param rejectReason 拒绝原因（拒绝时必填）
     * @return 是否成功
     */
    Boolean auditMoment(MomentAuditDTO dto);

    /**
     * 更新动态推荐状态
     *
     * @param momentId    动态ID
     * @param isRecommend 是否推荐:0-否,1-是
     * @return 是否成功
     */
    Boolean updateRecommendStatus(Long momentId, Integer isRecommend);

    /**
     * 更新动态上架状态
     *
     * @param momentId 动态ID
     * @param isList   是否上架:0-否,1-是
     * @return 是否成功
     */
    Boolean updateListStatus(Long momentId, Integer isList);

    /**
     * 根据动态ID查询动态简要详情（包含媒体URL列表）
     *
     * @param momentId 动态ID
     * @return 动态简要详情
     */
    MomentSimpleDetailVO getMomentSimpleDetail(Long momentId);

    Page<MomentVO> getByMerchantMoment(MerchantMomentDTO dto);

    Page<MomentPageVO> getMomentPage(MomentPageDTO dto);
}
