package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.common.vo.LoginVO;
import com.haha.common.vo.Result;
import com.haha.entity.Replenisher;
import com.haha.entity.dto.ReplenisherCreateDTO;
import com.haha.entity.dto.ReplenisherQueryDTO;
import com.haha.entity.dto.ReplenisherUpdateDTO;

import java.util.List;

/**
 * 补货员服务接口
 */
public interface ReplenisherService extends IService<Replenisher> {

    /**
     * 微信静默登录
     * 通过 wx.login 获取的 code 换取 openid，登录已绑定微信的补货员
     *
     * @param code 微信登录凭证
     * @return 登录结果，包含token和用户信息
     */
    Result<LoginVO> loginByWechat(String code);

    /**
     * 生成补货员绑定码
     * 管理员在后端创建补货员后，生成一次性绑定码用于补货员扫码绑定微信
     *
     * @param replenisherId 补货员ID
     * @return 绑定码字符串
     */
    String generateBindingCode(Long replenisherId);

    /**
     * 补货员扫码绑定微信
     * 补货员通过小程序扫描绑定二维码或输入绑定码，完成微信OpenID绑定并自动登录
     *
     * @param bindingCode 绑定码
     * @param wechatCode  微信登录凭证（wx.login获取的code）
     * @return 登录结果，包含token和用户信息
     */
    Result<LoginVO> bindWechat(String bindingCode, String wechatCode);

    /**
     * 分页查询补货员
     *
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    IPage<Replenisher> getPage(ReplenisherQueryDTO queryDTO);

    /**
     * 创建补货员
     *
     * @param dto 创建参数
     * @return 创建的补货员
     */
    Replenisher createReplenisher(ReplenisherCreateDTO dto);

    /**
     * 更新补货员信息
     *
     * @param id  补货员ID
     * @param dto 更新参数
     * @return 更新后的补货员
     */
    Replenisher updateReplenisher(Long id, ReplenisherUpdateDTO dto);

    /**
     * 启用/禁用补货员
     *
     * @param id     补货员ID
     * @param status 状态：1-启用，0-禁用
     */
    void updateStatus(Long id, Integer status);

    /**
     * 删除补货员（级联删除设备绑定）
     *
     * @param id 补货员ID
     */
    void deleteReplenisher(Long id);

    /**
     * 获取补货员详情（含绑定设备数）
     *
     * @param id 补货员ID
     * @return 补货员详情
     */
    Replenisher getReplenisherDetail(Long id);

    /**
     * 绑定设备到补货员
     *
     * @param replenisherId 补货员ID
     * @param deviceIds     设备SN号列表
     * @return 成功绑定的数量
     */
    int bindDevices(Long replenisherId, List<String> deviceIds);

    /**
     * 解绑补货员的某设备
     *
     * @param replenisherId 补货员ID
     * @param deviceId      设备SN号
     */
    void unbindDevice(Long replenisherId, String deviceId);

    /**
     * 批量绑定（多补货员到多设备）
     *
     * @param replenisherIds 补货员ID列表
     * @param deviceIds      设备SN号列表
     * @return 成功绑定的数量
     */
    int batchBindDevices(List<Long> replenisherIds, List<String> deviceIds);

    /**
     * 获取补货员绑定的设备ID列表
     *
     * @param replenisherId 补货员ID
     * @return 设备SN号列表
     */
    List<String> getBoundDeviceIds(Long replenisherId);

    /**
     * 获取设备绑定的补货员列表
     *
     * @param deviceId 设备SN号
     * @return 补货员列表
     */
    List<Replenisher> getReplenishersByDeviceId(String deviceId);

    /**
     * 通过门店查询补货员列表（通过设备关联反向推导）
     *
     * @param shopId 门店ID
     * @return 补货员列表
     */
    List<Replenisher> getReplenishersByShopId(Long shopId);

    /**
     * 关键词搜索启用的补货员
     *
     * @param keyword 搜索关键词
     * @return 补货员列表
     */
    List<Replenisher> searchByKeyword(String keyword);
}
