package com.aizuda.snailjob.template.datasource.access;

import com.aizuda.snailjob.server.model.dto.ConfigDTO;
import com.aizuda.snailjob.template.datasource.persistence.po.GroupConfig;
import com.aizuda.snailjob.template.datasource.persistence.po.NotifyConfig;
import com.aizuda.snailjob.template.datasource.persistence.po.RetrySceneConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;

import java.util.List;
import java.util.Set;

/**
 * 获取配置通道
 *
 * @author: opensnail
 * @date : 2022-01-05 09:06
 */
public interface ConfigAccess<T> extends Access<T> {


    /**
     * 根据组id获取缓存上下文
     *
     * @param groupName 组名称
     */
    GroupConfig getGroupConfigByGroupName(String groupName, String namespaceId);

    /**
     * 获取场景配置
     *
     * @param groupName   组名称
     * @param sceneName   场景名称
     * @param namespaceId 命名空间
     * @return {@link RetrySceneConfig} 场景配置
     */
    RetrySceneConfig getSceneConfigByGroupNameAndSceneName(String groupName, String sceneName, String namespaceId);


    /**
     * 获取通知配置
     *
     * @param shardingGroupId 组名称
     * @param namespaceId
     * @return {@link NotifyConfig} 通知配置
     */
    List<NotifyConfig> getNotifyListConfigByGroupName(String shardingGroupId, String namespaceId);

    /**
     * 获取场景配置
     *
     * @param groupName 组名称
     * @return {@link RetrySceneConfig} 场景配置
     */
    List<RetrySceneConfig> getSceneConfigByGroupName(String groupName);

    /**
     * 场景黑名单
     *
     * @return 黑名单列表
     */
    Set<String> getBlacklist(String groupName, String namespaceId);

    /**
     * 获取所有组配置信息
     *
     * @return 组配置列表
     */
    List<GroupConfig> getAllConfigGroupList(String namespaceId);


    /**
     * 获取所有场景配置信息
     *
     * @return 场景配置列表
     */
    List<RetrySceneConfig> getAllConfigSceneList();

    /**
     * 获取配置版本号
     *
     * @param groupName   组名称
     * @param namespaceId
     * @return 版本号
     */
    Integer getConfigVersion(String groupName, final String namespaceId);

    /**
     * 同步客户端配置
     *
     * @param groupName   组名称
     * @param namespaceId 命名空间id
     * @return ConfigDTO
     */
    ConfigDTO getConfigInfo(String groupName, final String namespaceId);

    List<T> list(LambdaQueryWrapper<T> query);

    int update(T t, LambdaUpdateWrapper<T> query);

    int updateById(T t);

    int delete(LambdaQueryWrapper<T> query);

    int insert(T t);

    T one(LambdaQueryWrapper<T> query);

    PageDTO<T> listPage(PageDTO<T> iPage, LambdaQueryWrapper<T> query);

    long count(LambdaQueryWrapper<T> query);

}
