package com.ruoyi.ss.store.service;

import com.ruoyi.common.core.domain.ValidateResult;
import com.ruoyi.ss.store.domain.Store;
import com.ruoyi.ss.store.domain.StoreVo;

import java.time.LocalTime;
import java.util.Collections;
import java.util.List;

/**
 * 2024/4/27
 *
 * @author wjh
 */
public interface StoreValidator {

    /**
     * 逻辑删除前校验
     * @param ids 店铺id列表
     */
    ValidateResult preLogicDel(List<Long> ids);

    /**
     * 前台逻辑删除前校验
     * @param storeIds 店铺id列表
     */
    ValidateResult preLogicDelByApp(List<Long> storeIds);

    /**
     * 更新前校验
     * @param data 数据
     */
    ValidateResult preUpdate(Store data);

    /**
     * 创建前校验
     * @param data 数据
     */
    ValidateResult preCreate(Store data);

    /**
     * 前台创建前校验
     * @param data 数据
     */
    ValidateResult preCreateByApp(Store data);

    /**
     * 前台更新前校验
     * @param data
     * @return
     */
    ValidateResult preUpdateByApp(Store data);

    /**
     * 排序前校验
     * @param list 排序列表
     */
    ValidateResult preChangeSortByApp(List<Store> list);

    /**
     * 判断店铺是否存在设备
     * @param ids 店铺id列表
     */
    boolean hasDevice(List<Long> ids);

    /**
     * 判断店铺是否属于用户
     */
    boolean isMch(List<Long> storeId, Long userId);

    default boolean isStoreBelongUser(Long storeId, Long userId) {
        return isMch(Collections.singletonList(storeId), userId);
    }

    /**
     * 判断店铺是否属于用户
     */
    boolean isMch(Store store, Long userId);

    /**
     * 判断店铺是否存在
     * @param storeIds
     */
    boolean isExist(List<Long> storeIds);

    /**
     * 设置默认店铺前校验
     */
    ValidateResult preSetDefaultByApp(Long userId, Long storeId);

    /**
     * 是否正在审核中
     */
    boolean isApproving(Store store);

    /**
     * 是否正在审核中
     */
    boolean hasApproving(List<Long> ids);

    /**
     * 判断是否在营业时间内
     */
    boolean isBusinessTime(StoreVo store, LocalTime time);

    /**
     * 后校验
     */
    void afterCheck(StoreVo vo);

    /**
     * 允许操作店铺
     * @param store 店铺
     * @param userId 用户
     */
    boolean canOperaStore(StoreVo store, Long userId);

    /**
     * 允许操作店铺
     */
    boolean canOperaStore(Long storeId, Long userId);

    /**
     * 允许查看店铺
     */
    boolean canViewStore(Long storeId, Long userId);

    /**
     * 允许查看店铺
     */
    boolean canViewStore(StoreVo store, Long userId);

    /**
     * 校验是否能操作所有店铺
     */
    boolean canOperaAllStore(List<Long> storeIds, Long userId);
}
