package com.m2pool.lease.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.m2pool.common.datasource.annotation.HashRateDB;
import com.m2pool.common.datasource.annotation.Pool2DB;
import com.m2pool.lease.dto.*;
import com.m2pool.lease.entity.LeaseProductMachine;
import com.m2pool.lease.vo.ProductMachineVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 商品表对应的物品机器表 Mapper 接口
 * </p>
 *
 * @author yyb
 * @since 2025-07-23
 */
@Mapper
public interface LeaseProductMachineMapper extends BaseMapper<LeaseProductMachine> {


    /**
     * 获取当前账户对应的挖矿账户
     *
     * @param userId 账户ID
     * @return 挖矿账户集合
     */
    @Pool2DB
    List<UserMinerDto> getUserMinersList(@Param("userId") String userId, @Param("coin") String coin);

    /**
     * 根据机器ID集合获取机器信息
     *
     * @param machineIds 机器ID集合
     * @return 机器信息集合
     */
    List<ProductMachineDto> getMachinesByIds(@Param("machineIds") List<Long> machineIds);

    /**
     * 创建订单业务----修改乐观锁(sale_state 改为 2 售出中)
     * @param machineIds
     * @return
     */
    int updateLockState(@Param("machineIds") List<Long> machineIds);

    /**
     * 获取当前账户对应的挖矿账户的机器矿工集合 (1天内有过算力的才能上架)
     *
     * @param user 账户ID
     * @param coin 币种
     * @return 挖矿账户的机器矿工集合
     */
    @Pool2DB
    List<UserMinerDto> getMinerMachines(@Param("user") String user, @Param("coin") String coin);

    /**
     * 获取当前账户对应的挖矿账户的已经上架正在售出或已售出的机器矿工
     *
     * @param user 账户ID
     * @param coin 币种
     * @return 挖矿账户的机器矿工集合
     */
    List<String> getMinerMachinesIsSale(@Param("user") String user, @Param("coin") String coin);

    /**
     * 获取商品价格范围
     *
     * @param productId 商品ID
     * @return 商品价格范围
     */
    PriceDto getPriceRange(@Param("productId") Long productId);


    @Pool2DB
    List<ProductMachineDto> getRecentlyFiveMinutesData(@Param("leaseProductMachines") List<LeaseProductMachine> leaseProductMachines, @Param("coin") String coin);



    int saveOrUpdateBatchs(@Param("leaseProductMachines") List<LeaseProductMachine> leaseProductMachines);


    /**
     * 检测当前商铺是否有已售出机器
     *
     * @param shopId 商家ID
     * @return 检测结果
     */
    int checkHasSaleMachineByShopId(@Param("shopId") Long shopId);

    /**
     * 检测当前商品是否存在已售出机器
     *
     * @param productId 商品ID
     * @return 检测结果
     */
    int checkHasSaleMachineByProductId(@Param("productId") Long productId);



    /**
     * 获取机器售价列表
     *
     * @param machineIds 机器ID集合
     * @return 机器价格列表
     */
    List<MachinePayTypeDto> getPriceList(@Param("list")List<Long> machineIds);


    /**
     * 查询绑定新钱包后，已存在的商品矿机
     *
     * @param shopId 店铺id
     * @return 商品列表
     */
    List<ProductMachineForWalletConfigDto> getProductListForShopWalletConfig(@Param("shopId")Long shopId);


    /**
     * 获取商品对应的机器ID集合
     *
     * @param productId 商品ID
     * @return 机器ID集合
     */
    List<Long> getIdsForProductId(@Param("productId")Long productId);


    /**
     * 获取店铺对应的机器ID集合
     *
     * @param productId 商品ID
     * @return 机器ID集合
     */
    List<Long> getIdsForShopId(@Param("shopId")Long shopId);

    /**
     * 根据价格范围，功耗范围，算力范围 获取商品对应的机器
     *
     * @param productMachineVo 商品参数
     * @return 机器列表
     */
    List<ProductMachineDto>  getMachinesByPriceAndPowerAndDissipation(@Param("productMachineVo") ProductMachineVo productMachineVo,@Param("coin") String coin);


    /**
     * 批量插入机器算力数据
     *
     * @param list 机器算力数据
     * @return 插入结果
     */
    int batchInsertPowers(@Param("coin")String coin,@Param("list")List<ProductMachineDto> list);

}
