package com.easyagents.federation.sql.source;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

/**
 * 调用方可实现的共享状态读取与变更提示 SPI，例如 Redis 实现。
 */
public interface FederationSourceStateProvider {

    /**
     * 按需读取某个数据源的最新共享状态。
     *
     * @param sourceId 数据源标识
     * @return 最新状态
     */
    Optional<FederationSourceState> find(SourceId sourceId);

    /**
     * 加载节点启动时的状态快照。
     *
     * @return 状态快照
     */
    default Collection<FederationSourceState> loadSnapshot() {
        return List.of();
    }

    /**
     * 订阅状态变更提示；可靠性仍由按需读取与快照恢复保证。
     *
     * @param consumer 状态消费者
     * @return 可关闭订阅
     */
    default SourceStateSubscription subscribe(Consumer<FederationSourceState> consumer) {
        return () -> { };
    }

    /**
     * 返回不访问共享存储的空实现。
     *
     * @return 空状态 Provider
     */
    static FederationSourceStateProvider none() {
        return sourceId -> Optional.empty();
    }
}
