package com.kexue.skills.service;

import com.github.pagehelper.PageInfo;
import com.kexue.skills.entity.ContentPurchase;
import com.kexue.skills.entity.dto.ContentPurchaseDto;

import java.util.List;

/**
 * (ContentPurchase)表服务接口
 *
 * @author 王志维
 * @since 2025-02-21 23:01:48
 */
public interface ContentPurchaseService extends BaseService {
    /**
     * 分页查询
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    PageInfo<ContentPurchase> getPageList(ContentPurchaseDto queryDto);

    /**
     * 查询列表
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    List<ContentPurchase> getList(ContentPurchaseDto queryDto);

    /**
     * 通过主键查询单条数据
     *
     * @param purchaseId 主键
     * @return 实例对象
     */
    ContentPurchase queryById(Long purchaseId);

    /**
     * 通过用户ID和内容ID查询购买记录
     *
     * @param userId 用户ID
     * @param contentId 内容ID
     * @return 实例对象
     */
    ContentPurchase queryByUserIdAndContentId(Long userId, Long contentId);

    /**
     * 新增数据
     *
     * @param purchase 实例对象
     * @return 实例对象
     */
    ContentPurchase insert(ContentPurchase purchase);

    /**
     * 更新数据
     *
     * @param purchase 实例对象
     * @return 实例对象
     */
    ContentPurchase update(ContentPurchase purchase);

    /**
     * 更新购买状态
     *
     * @param purchaseId 购买ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(Long purchaseId, Integer status);

    /**
     * 通过主键逻辑删除
     *
     * @param purchaseId 主键
     * @param updateBy 更新人
     * @return 影响行数
     */
    int logicDeleteById(Long purchaseId, String updateBy);

    /**
     * 通过主键物理删除
     *
     * @param purchaseId 主键
     * @return 影响行数
     */
    int deleteById(Long purchaseId);

    /**
     * 购买内容
     *
     * @param userId 用户ID
     * @param contentId 内容ID
     * @param payType 支付方式：1.余额支付 2.积分支付
     * @return 购买结果
     */
    ContentPurchase purchaseContent(Long userId, Long contentId, Integer payType);

    /**
     * 检查用户是否有权限访问内容
     *
     * @param userId 用户ID
     * @param contentId 内容ID
     * @return 是否有权限
     */
    boolean checkAccessPermission(Long userId, Long contentId);
}