package com.iamberry.rent.face.machine;

import java.util.List;

import com.iamberry.exception.ServiceException;
import com.iamberry.wechat.core.entity.ResultMsg;
import com.iamberry.wechat.core.entity.rent.*;
import com.iamberry.wechat.tools.ResponseJson;

/**
 * 机器业务暴露接口
 * @company 深圳爱贝源科技有限公司
 * @website www.iamberry.com
 * @author  献
 * @tel     18271840547
 * @date    2017年3月9日
 */
public interface MachineService {

    /**
     * 激活机器 - 扫描二维码激活, 必须有openid 以及其deviceid参数, 整个过程不包含返利
     * @param machineInfo
     * @return
     * @author 献
     * @throws ServiceException 
     * @Time   2017年3月10日
     */
    int initBefore(MachineInfo machineInfo) throws ServiceException;
    
    /**
     * 激活返利，在接受到机器上报的数据以后，开始激活返利的操作
     * @param openid
     * @param deviceId
     * @return
     * @author 献
     * @throws ServiceException 
     * @Time   2017年4月5日
     */
    int init(String openid, String deviceId) throws ServiceException;
    
    /**
     * 查询机器信息,如果deviceid不能为空，那么查询为单条数据
     * @param info
     * @return
     * @author 献
     * @Time   2017年3月10日
     */
    List<MachineInfo> list(MachineInfo info);
    
    /**
     * 同步机器信息（TDS、剩余水量）
     * @param info
     * @return
     * @author 献
     * @Time   2017年3月10日
     */
    Integer syncMachine(MachineInfo info);
    
    /**
     * 获取当前用户服务费抵扣券列表
     * @Date 2017年3月22日
     * @author muzx
     * @return
     */
    ResponseJson listServiceCoupon(String openId, String machineId);
    /**
     * 为机器续费 - 请求支付
     * @param machineRecharge
     * @return
     * @author 献
     * @Time   2017年3月13日
     */
    ResponseJson requestPay(MachineRecharge machineRecharge, Integer couponId);
    
    /**
     * 根据续费记录的订单id - 请求支付
     */
    ResponseJson rechargeOrderIdPay(String orderId);
    
    /**
     * 续费支付回调
     * @param orderId
     * @return  0 : 失败；其他表示成功
     * @author 献
     * @Time   2017年3月13日
     */
    Integer rechargeOrderPayCallback(String orderId, String transactionId);
    
    /**
     * 查询续费记录
     */
    List<MachineRecharge> listRecharge(Integer machineId);
    
    /**
     * 后台机器信息列表
     * @param machineInfo
     * @return
     */
    List<MachineInfo> selectEquipmentList(MachineInfo machineInfo);
    
    /**
     * 后台机器信息总数
     * @param machineInfo
     * @return
     */
    Integer selectEquipmentCount(MachineInfo machineInfo);
    
    /**
     * 添加机器，注意：只能初始化机器信息
     * @param info
     * @return
     * @author LJK
     * @Time   2017年3月16日10:58:27
     */
    Integer add(MachineInfo info);
    
    /**
     * 根据 id 或 orderid 查询单个充值记录
     * @date 2017年3月22日
     * @author muzx
     * @param recharge
     * @return
     */
    MachineRecharge getRechargeByIdOrOrderId(MachineRecharge recharge);
    
    /**
     * 订单详情页面送人 将机器分享出去，添加分享记录
     * 2017年3月29日
     * @author muzx
     * @param orderItemId
     * @param openId
     * @return
     */
    ResultMsg presentMachine(String orderItemId, String openId);
    
    /**
     * 领取他人分享的机器
     * 2017年3月29日
     * @author muzx
     */
    ResultMsg receiveMachine(String shareId, String openId);
    
    /**
     * 绑定用户和机器的关系
     * @param machineId
     * @param openId
     * @return
     * @author 献
     * @Time   2017年3月20日
     */
    int bindMachineToOpenId(String machineId, String openId);
    
    /**
     * 根据设备id查询单个设备
     * @param machineInfo
     * @return
     */
    MachineInfo selectMachineById(MachineInfo machineInfo);
    
    /**
     * 分页查询所有分享机器记录<后台>
     * 2017年3月20日
     * @author muzx
     * @param machineShare
     * @return
     */
    List<MachineShare> listMachineShareAdmin(MachineShare machineShare);
    
    /**
     * 查询所有分享机器记录总数<后台>
     * 2017年3月20日
     * @author muzx
     * @return
     */
    int countMachineShare(MachineShare machineShare);
    
    /**
     * 处理存在下一条指令的机器，注意：此方法只下发指令，不参与具体的业务逻辑
     * @author 献
     * @Time   2017年4月8日
     */
    void handlerNextCommand();
    
    /**
	 * 修改机器,根据machineId或deviceid修改，其他不能为空的机器信息
	 * @param info
	 * @return
	 * @author LJK
	 * @Time   2017年4月7日16:23:53
	 */
	Integer update(MachineInfo info);
	
	/**
     * 根据条件查询滤芯更换记录
     * @param rentChangeLogs
     * @return
     */
    List<RentChangeLogs> listSelectChangeLogs(RentChangeLogs rentChangeLogs);
    
    /**
     * 批量添加滤芯更换记录
     * @param list
     * @return
     */
    Integer saveChangeLogs(List<RentChangeLogs> list, RentOrder rentOrder) throws Exception;
    
    /**
     * 查询更换滤芯集合
     * @param rentChangeLogs
     * @return
     */
    List<RentChangeLogs> listChangeFilterLogs(RentChangeLogs rentChangeLogs);
    
    /**
     * 根据条件查询更换滤芯数量
     * @param rentChangeLogs
     * @return
     */
    Integer getChangeFilterCount(RentChangeLogs rentChangeLogs);

    /**
     * 新增比拼水质记录
     * @param competeWaterInfo
     * @return
     */
    Integer addCompeteWater(CompeteWaterInfo competeWaterInfo);

    /**
     * 查询比拼水质记录
     * @param shareId
     * @return
     */
    CompeteWaterInfo selectCompeteWater(String shareId);

    /**
     * 修改滤芯更换记录表
     * @param rentChangeLogs
     * @return
     */
    boolean updateChangeLogsById(RentChangeLogs rentChangeLogs);
}
