package com.yc.ship.module.otc.service.store;

import com.yc.ship.framework.common.pojo.PageParam;
import com.yc.ship.framework.common.pojo.PageResult;
import com.yc.ship.module.otc.api.store.dto.StoreCardRespDTO;
import com.yc.ship.module.otc.api.store.dto.StoreMachineDTO;
import com.yc.ship.module.otc.api.store.dto.StoreProductReqDTO;
import com.yc.ship.module.otc.controller.admin.store.machine.SellerMachineRespVO;
import com.yc.ship.module.otc.controller.admin.store.vo.*;
import com.yc.ship.module.otc.dal.dataobject.store.*;
import com.yc.ship.module.otc.dal.dataobject.storeaudit.StoreAuditDO;
import com.yc.ship.module.otc.dal.dataobject.storecard.StoreCardDO;
import com.yc.ship.module.otc.enums.TradeModeEnum;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;

/**
 * 旅行社门店 Service 接口
 *
 * @author 管理员
 */
public interface StoreService {

    /**
     * 创建旅行社门店
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createStore(@Valid StoreSaveReqVO createReqVO);

    /**
     * 更新旅行社门店
     *
     * @param updateReqVO 更新信息
     */
    void updateStore(@Valid StoreSaveReqVO updateReqVO);

    /**
     * 删除旅行社门店
     *
     * @param id 编号
     */
    void deleteStore(Long id);

    /**
     * 门店审核
     *
     * @param auditReqVO 审核信息
     * @return 编号
     */
    Long auditStore(StoreAuditReqVO auditReqVO);


    /**
     * 获得旅行社门店
     *
     * @param id 编号
     * @return 旅行社门店
     */
    StoreDO getStore(Long id);

    /**
     * 获得旅行社门店(用户id)
     *
     * @param userId 编号
     * @return 旅行社门店
     */
    StoreCardRespDTO getStoreByUserId(Long userId);

    /**
     * 获得旅行社门店分页
     *
     * @param pageReqVO 分页查询
     * @return 旅行社门店分页
     */
    PageResult<StoreDO> getStorePage(StorePageReqVO pageReqVO);

    /**
     * 审核门店分页
     * @param pageReqVO
     * @return
     */
    PageResult<StoreRespVO> getAuditStorePage(StoreAuditPageReqVO pageReqVO);
    /**
     * 修改状态
     *
     * @param id     用户编号
     * @param status 状态
     */
    void updateStoreStatus(Long id, Integer status);

    List<StoreDO> getSotreList(Collection<Long> ids);

    List<StoreDO> getStoreListByStatus(Integer status);

    // ==================== 子表（关联设备） ====================

    /**
     * 获得关联设备分页
     *
     * @param pageReqVO 分页查询
     * @param storeId   门店ID
     * @return 关联设备分页
     */
    PageResult<StoreMachineDO> getStoreMachinePage(PageParam pageReqVO, Long storeId);

    /**
     * 创建关联设备
     *
     * @param storeMachine 创建信息
     * @return 编号
     */
    Long createStoreMachine(@Valid StoreMachineDO storeMachine);

    /**
     * 更新关联设备
     *
     * @param storeMachine 更新信息
     */
    void updateStoreMachine(@Valid StoreMachineDO storeMachine);

    /**
     * 删除关联设备
     *
     * @param id 编号
     */
    void deleteStoreMachine(Long id);

    /**
     * 获得关联设备
     *
     * @param id 编号
     * @return 关联设备
     */
    StoreMachineDO getStoreMachine(Long id);

    List<StoreMachineDO> getStoreMachineListByStatus(Integer machineType);

    List<SellerMachineRespVO> getSellerMachine();

    // ==================== 子表（门店账号关联） ====================

    /**
     * 获得门店账号关联分页
     *
     * @param pageReqVO 分页查询
     * @param storeId   门店ID
     * @return 门店账号关联分页
     */
    PageResult<StoreUserDO> getStoreUserPage(PageParam pageReqVO, Long storeId);

    /**
     * 创建门店账号关联
     *
     * @param storeUser 创建信息
     * @return 编号
     */
    Long createStoreUser(@Valid StoreUserDO storeUser);

    /**
     * 更新门店账号关联
     *
     * @param storeUser 更新信息
     */
    void updateStoreUser(@Valid StoreUserDO storeUser);

    /**
     * 删除门店账号关联
     *
     * @param id 编号
     */
    void deleteStoreUser(Long id);
    void deleteStoreUserByUserId(Long userId,Long storeId);

    /**
     * 获得门店账号关联
     *
     * @param storeId 门店编号
     * @return 门店账号关联
     */
    List<StoreUserDO> getStoreUser(Long storeId);

    /**
     * 获得旅行社下所有被门店关联的账号
     *
     * @param type 0.忽略所有条件 1.根据主键ID查询 2.根据用户ID查询
     * @param ids
     * @return 旅行社下所有被门店关联的账号
     */
    List<StoreUserDO> getStoreUserList(int type, Collection<Long> ids);

    // ==================== 子表（门店产品关联） ====================

    /**
     * 获得门店产品关联分页
     *
     * @param pageReqVO 分页查询
     * @param storeId   门店ID
     * @return 门店产品关联分页
     */
    PageResult<StoreProductDO> getStoreProductPage(PageParam pageReqVO, Long storeId);

    /**
     * 创建门店产品关联
     *
     * @param storeProduct 创建信息
     * @return 编号
     */
    Long createStoreProduct(@Valid StoreProductDO storeProduct);

    /**
     * 更新门店产品关联
     *
     * @param storeProduct 更新信息
     */
    void updateStoreProduct(@Valid StoreProductDO storeProduct);

    /**
     * 删除门店产品关联
     *
     * @param id 编号
     */
    void deleteStoreProduct(Long id);

    /**
     * 获得门店产品关联
     *
     * @param storeId 门店编号
     * @return 门店产品关联
     */
    List<StoreProductDO> getStoreProduct(Long storeId);

    // ==================== 子表（门店产品设备关联） ====================

    /**
     * 创建门店设备关联
     *
     * @param storeMachineProduct 创建信息
     * @return 编号
     */
    Long createStoreMachineProduct(@Valid StoreMachineProductDO storeMachineProduct);

    /**
     * 更新门店设备关联
     *
     * @param storeMachineProduct 更新信息
     */
    void updateStoreMachineProduct(@Valid StoreMachineProductDO storeMachineProduct);

    /**
     * 删除门店设备关联
     *
     * @param id 编号
     */
    void deleteStoreMachineProduct(Long id);

    /**
     * 获得门店设备关联
     *
     * @param storeId 编号
     * @return 门店设备关联
     */
    List<StoreMachineProductDO> getStoreMachineProduct(Long storeId, Long machineId);

    /**
     * @param storeId    门店ID
     * @param tradeMode  交易类型 0.不变 1.增加、2.减少 3.回滚
     * @param amount     充值金额/交易金额/额度变更金额
     * @param userId     用户ID
     * @param orderId    订单ID
     * @param tradeLogId 支付记录ID 回滚使用
     * @return
     */
    Long updateStoreCard(Long storeId, TradeModeEnum tradeMode, BigDecimal amount, Long userId, Long orderId, Long refundId, Long tradeLogId);

    StoreMachineDTO getMachineByMachineId(String machineId);

    List<StoreDO> getStoreListByDistributor(Long distributorId);

    Long changePlatCredit(StorePlatCreditSaveReqVO reqVO);

    Long updateStoreCardWithPlat(StoreCardDO storeCardDO , StoreAuditDO storeAudit, TradeModeEnum tradeMode, Long userId);

    void updateStoreProductStatus(StoreProductReqDTO reqDTO);

    StoreBalanceRespVO queryStoreCreditAndBalance(Integer whetherShow);

    List<StoreDO> getStoreList(StoreSimpleReqVO reqVO);
}
