package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.entity.DeviceInventory;
import com.haha.entity.dto.InventoryQueryDTO;

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

/**
 * 设备库存服务接口
 */
public interface DeviceInventoryService extends IService<DeviceInventory> {

    /**
     * 分页查询设备库存列表
     *
     * @param page     页码
     * @param pageSize 每页条数
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    IPage<DeviceInventory> getPage(int page, int pageSize, InventoryQueryDTO queryDTO);

    /**
     * 查询设备的库存列表（带商品详情）
     *
     * @param deviceId 设备ID
     * @return 库存列表
     */
    List<Map<String, Object>> getInventoryWithProduct(String deviceId);

    /**
     * 查询低库存商品列表
     *
     * @return 低库存商品列表
     */
    List<Map<String, Object>> getLowStockList();

    /**
     * 增加库存（上货）
     *
     * @param deviceId     设备ID
     * @param productId    商品ID
     * @param productCode  商品编码
     * @param productName  商品名称
     * @param quantity     增加数量
     * @param shelfNum     货架层号
     * @param position     货道位置
     * @param operatorId   操作人ID
     * @param operatorName 操作人名称
     * @param activityId   活动号
     * @return 库存记录
     */
    DeviceInventory increaseStock(String deviceId, Long productId, String productCode, String productName,
                                  Integer quantity, Integer shelfNum, String position,
                                  Long operatorId, String operatorName, String activityId);

    /**
     * 减少库存（销售）
     *
     * @param deviceId     设备ID
     * @param productId    商品ID
     * @param quantity     减少数量
     * @param orderId      订单号
     * @param operatorId   操作人ID
     * @param operatorName 操作人名称
     * @return 库存记录
     */
    DeviceInventory decreaseStock(String deviceId, Long productId, Integer quantity,
                                  String orderId, Long operatorId, String operatorName);

    /**
     * 调整库存
     *
     * @param deviceId     设备ID
     * @param productId    商品ID
     * @param newStock     新库存数量
     * @param remark       备注
     * @param operatorId   操作人ID
     * @param operatorName 操作人名称
     * @return 库存记录
     */
    DeviceInventory adjustStock(String deviceId, Long productId, Integer newStock,
                                String remark, Long operatorId, String operatorName);

    /**
     * 获取库存统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 根据设备和商品查询库存
     *
     * @param deviceId  设备ID
     * @param productId 商品ID
     * @return 库存记录
     */
    DeviceInventory getByDeviceAndProduct(String deviceId, Long productId);

    /**
     * 重新计算指定设备的标准库存（从层模版汇总）
     * 解析层模版的 leftFloors/rightFloors，按 productCode 累加各商品的标准库存，
     * 写入 DeviceInventory.standardStock
     *
     * @param deviceId 设备SN号
     */
    void recalculateStandardStock(String deviceId);

    /**
     * 分页查询设备库存统计列表
     *
     * @param page     页码
     * @param pageSize 每页条数
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    IPage<Map<String, Object>> getDeviceInventoryStats(int page, int pageSize, InventoryQueryDTO queryDTO);
}
