package com.m2pool.lease.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.m2pool.lease.dto.MachinePayTypeDto;
import com.m2pool.lease.dto.v2.*;
import com.m2pool.lease.entity.LeaseMachine;
import com.m2pool.lease.vo.v2.SellerMachineVo;
import com.m2pool.lease.vo.v2.ShopMachineVo;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * gpu类型出售矿机表 Mapper 接口
 * </p>
 *
 * @author yyb
 * @since 2025-11-21
 */
public interface LeaseMachineMapper extends BaseMapper<LeaseMachine> {

    /**
     * 获取店铺ids
     * @return
     */
    Set<Long> getShopIds();

    /**
     * 根据id集合查询店铺信息
     * @return
     */
    List<ShopInfoDto> getExistsMachineShop(@Param("ids") Set<Long> ids, @Param("coin") String coin , @Param("algorithm") String algorithm);


    /**
     * 获取店铺对应GPU或ASIC矿机信息
     * @param shopMachineVo
     * @return
     */
    List<MachineInfoDto> getShopMachineList(@Param("shopMachineVo") ShopMachineVo shopMachineVo);


    /**
     * 根据id集合获取gpu配置信息
     * @param ids
     * @return
     */
    List<PowerIncomeInfoDto> getGpuConfigList(@Param("ids") List<Long> ids);


    /**
     * 获取店铺Gpu或Asic对应矿机信息
     * @param sellerMachineVo
     * @return
     */
    List<SellerMachineInfoDto> getShopMachineListForSeller(@Param("sellerMachineVo") SellerMachineVo sellerMachineVo, @Param("shopId") Long shopId);

    /**
     * 根据矿机id获取对应的矿机价格列表
     * @param ids
     * @return
     */
    List<MachinePayTypeDto> getMachinePriceList(@Param("list") List<SellerMachineInfoDto> ids);


    /**
     * 根据矿机id获取对应的矿机价格列表
     * @param machineIds
     * @return
     */
    List<Long> getShopIdsByMachineIds(@Param("machineIds") List<Long> machineIds);


    /**
     * 获取购物车对应矿机信息
     * @param machineIds
     * @return
     */
    List<CartMachineInfoDto> getMachinesByIds(@Param("machineIds") List<Long> machineIds);


    /**
     * 获取购物车对应矿机信息
     * @param ids
     * @return
     */
    List<AsicCoinAndAlgoDto> getCoinAndAlgoList(@Param("list") List<SellerMachineInfoDto> ids);


    /**
     * 修改gpu矿机售出状态
     * @param asicMachines
     * @return
     */
    int updateLockState(@Param("list") List<LeaseMachine> asicMachines);


    /**
     * 修改asic 矿机售出数量
     * @param gpuMachines
     * @return
     */
   int updateLockNumbers(@Param("list")  List<LeaseMachine> gpuMachines);



   /**
   * 根据id 获取配置算法和币种
   * @param ids
   * @return
   */
   @MapKey("id")
   Map<Long, MiningConfigDto> getCoinAndAlgoById(@Param("ids") List<Long> ids);



   /**
   * 获取矿机详情信息含临时信息
   * @param machineId
   * @return
   */
   List<MachineConfigDto> getEffectMachineAndTempMachineList(@Param("machineId") Long machineId);


    /**
     * 获取租赁系统中支持的币种（挖矿软件支持  +  矿池支持的交集）
     * @return
     */
    List<String> getSupportCoin();


    /**
     * 获取租赁系统中支持的算力（挖矿软件支持  +  矿池支持的交集）
     * @return
     */
    List<String> getSupportAlgo(@Param("coin") String coin);

    /**
     * 检测矿机是否能够上架
     * @param ids
     * @return
     */
    @MapKey("machineId")
    Map<Long, MachineEffectDto> checkIsEffect(@Param("list") List<SellerMachineInfoDto> ids);



    /**
     * 批量修改矿机已售可售数量
     * @param list
     * @return
     */
    boolean updateBatchSaleNumbers(@Param("list") List<LeaseMachine> list);

    /**
     * 检测店铺下是否有已出售的矿机
     * @return
     */
    int checkHasSaleMachineByShopId(@Param("shopId") Long shopId);

}
