package shop.alien.second.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Transactional;
import shop.alien.entity.SecondVideoTask;
import shop.alien.entity.second.SecondGoods;
import shop.alien.entity.second.SecondGoodsRecord;
import shop.alien.entity.second.SecondRiskControlRecord;
import shop.alien.entity.second.vo.SecondGoodsVo;
import shop.alien.entity.second.vo.SecondGoodsAdminQueryDTO;
import shop.alien.entity.second.vo.SecondGoodsDetailVo;
import shop.alien.entity.second.vo.SecondGoodsRecordDetailVo;
import shop.alien.entity.second.vo.SellGoodsVo;

import java.util.List;

/**
 * 二手商品服务接口
 */
public interface SecondGoodsService extends IService<SecondGoods> {

    /**
     * 创建二手商品基本信息
     * @param goods 二手商品实体
     * @param editFlag 编辑标识 0:创建 1:编辑
     * @return 是否成功保存
     */
    @Transactional
    boolean createBasicInfo(SecondGoodsVo goods, Integer editFlag) throws Exception;

    /**
     * 保存为草稿
     * @param goods 二手商品实体
     * @return 是否成功保存
     */
    boolean saveAsDraft(SecondGoodsVo goods);

    /**
     * 获取用户屏蔽的商品列表（分页）
     * @param page 分页参数
     * @param userId 用户ID
     * @param shieldType 屏蔽类型
     * @return 分页后的屏蔽商品列表
     */
    IPage<SecondGoods> getShieldedGoodsListByType(IPage<SecondGoods> page, Integer userId, Integer shieldType);

    /**
     * 获取商品热卖排行榜
     * @param page 分页参数
     * @return 商品热卖排行榜列表
     */
    IPage<SecondGoods> getHotSellingRanking(IPage<SecondGoods> page);

    /**
     * 获取商品热卖排行榜（前10名），按标签聚合计算总点赞量
     * @return 热卖排行榜列表
     */
    List<SecondGoods> getHotSellingRankingTop10();

    /**
     * 获取商品收藏排行榜（前10名）
     * @return 商品收藏排行榜列表
     */
    List<SecondGoods> getCollectTop10();

    /**
     * 搜索结果-商品列表
     * @param secondGoodsVo 搜索条件
     * @return 搜索结果列表
     */
    IPage<SecondGoodsVo> searchGoodsList(IPage<SecondGoodsVo> page,Integer userId, SecondGoodsVo secondGoodsVo);

    /**
     * 获取商品详情
     * @param id 商品ID
     * @return 商品详情
     */
    SecondGoodsVo getSecondGoodsById(Integer id);

    /**
     * 获取用户屏蔽的商品列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的屏蔽商品列表
     */
    IPage<SecondGoodsVo>  getShieldedGoodsPage(IPage<SecondGoodsVo> page, Integer userId);

    /**
     * 获取我收藏的商品列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的收藏商品列表
     */
    IPage<SecondGoodsVo> getCollectGoodsPage(IPage<SecondGoodsVo> page, int userId);

    /**
     * 获取我购买的商品列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的购买商品列表
     */
    IPage<SecondGoodsVo> getBuyGoodsPage(IPage<SecondGoodsVo> page, int userId);

    /**
     * 获取我卖出的商品列表（分页）
     * @param page 搜索条件
     * @param secondGoodsVo 查询参数
     * @param userId 用户ID
     * @return 分页后的卖出商品列表
     */
    IPage<SecondGoodsVo> getSellGoodsPage(IPage<SecondGoodsVo> page, SecondGoodsVo secondGoodsVo,int userId);

    /**
     * 获取用户发布的商品列表（分页）
     * @param page 搜索条件
     * @param currentLatitude 当前纬度
     * @param currentLongitude 当前经度
     * @param userId 用户ID
     * @return 分页后的用户商品列表
     */
    IPage<SecondGoodsVo> getUserGoodsPage(IPage<SecondGoodsVo> page, Double currentLatitude , Double currentLongitude, Integer userId);

    /**
     * 获取我的商品列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的我的商品列表
     */
    IPage<SecondGoodsVo> getMyGoodsPage(IPage<SecondGoodsVo> page, int userId);

    /**
     * 获取草稿列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的草稿列表
     */
    IPage<SecondGoodsVo> getDraftList(IPage<SecondGoodsVo> page, int userId);

    /**
     * 获取点赞商品列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @param phone 用户手机号
     * @return 分页后的点赞商品列表
     */
    IPage<SecondGoodsVo> getLikeGoodsPage(IPage<SecondGoodsVo> page, int userId, String phone);

    /**
     * 获取商品交易列表（分页）
     * @param page 搜索条件
     * @param userId 用户ID
     * @return 分页后的商品交易列表
     */
    IPage<SellGoodsVo> getTransactionList(IPage<SellGoodsVo> page, Integer userId);

    List<SecondGoods> getGoodsListByUserId(Integer userId, Integer goodsStatus);

    /**
     * 处理视频审核结果
     * @param task 视频审核任务
     */
    void processVideoModerationResult(SecondVideoTask task);
    
    /**
     * 记录商品操作历史
     * @param goods 商品信息
     */
    void recordGoodsOperation(SecondGoods goods,String operationName);
    /**
     * 管理后台商品列表查询
     * @param page 分页参数
     * @param queryDTO 查询参数
     * @return 商品列表
     */
    IPage<SecondGoodsVo> getAdminGoodsList(IPage<SecondGoodsVo> page, SecondGoodsAdminQueryDTO queryDTO);
    
    /**
     * 获取商品详情（管理后台使用）
     * @param goodsId 商品ID
     * @return 商品详情信息
     */
    SecondGoodsDetailVo getAdminGoodsDetail(Integer goodsId) throws Exception;

    /**
     * 获取管理后台商品操作记录详情
     * @param recordId 操作记录ID
     * @return 操作记录详情
     */
    SecondGoodsRecordDetailVo getAdminGoodsRecordDetail(Integer recordId);

    /**
     * 下架商品
     * @param secondGoods 商品信息
     * @return 是否下架成功
     */
    boolean shelveSecondGoods(SecondGoodsVo secondGoods);

    /**
     * 处理商品信息（管理后台使用）
     * @param goodsId 商品ID
     * @return 处理后的商品详情信息
     */
    SecondGoodsDetailVo dealSecondGoodsInfo(Integer goodsId);

    /**
     * 处理商品记录信息（管理后台使用）
     * @param goodsId 商品记录ID
     * @return 处理后的商品详情信息
     */
    SecondGoodsVo dealSecondGoodsRecordInfo(Integer goodsId);

    /**
     * 批量处理商品信息（管理后台使用）（ ruleType = 4 异常发布场景）
     * @param ruleType 风险类型
     * @param businessId 业务ID
     * @return 是否处理成功
     */
    boolean batchShelveGoodsByRiskControlRecord(Integer ruleType, String businessId);

    /**
     * 执行商品发布风控检查
     * @param goods 商品信息
     */
    void performPublishRiskCheck(SecondGoods goods);
}