/**
 * @packageDocumentation
 * @module k8s-resource-list
 */
import { HttpErrorResponse } from '@angular/common/http';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { WatchAPIResponse } from '../api/types';
import { StringMap, KubernetesResource, KubernetesResourceList, Status } from '../core/public-api';
import { K8SResourceList } from './k8s-resource-list';
export type Watcher<R extends KubernetesResource, Q> = (seedVersion: string, params?: Q) => Observable<WatchAPIResponse<R>>;
export type InsertFn<R> = (items: R[], res: R, hasMore: boolean) => R[];
export interface WatcherParams<R extends KubernetesResource, Q> {
    list: K8SResourceList<R>;
    watcher: Watcher<R, Q>;
    insertFn?: InsertFn<R>;
}
interface BaseConfig<R extends KubernetesResource, Q> {
    watcher?: Watcher<R, Q>;
    insertFn?: InsertFn<R>;
    limit?: number;
    polling?: number;
}
export type ItemsScanner<R> = (items: R[]) => R[];
export interface ConfigWithRoute<R, Q, P> extends BaseConfig<R, Q> {
    fetcher: (params: P) => Observable<KubernetesResourceList<R>>;
    activatedRoute?: ActivatedRoute;
}
export interface ConfigWithParams<R, Q, P> extends BaseConfig<R, Q> {
    fetcher: (params: P) => Observable<KubernetesResourceList<R>>;
    fetchParams$?: Observable<Q>;
}
export declare enum LoadAction {
    Reload = "Reload",
    SilentReload = "SilentReload",
    LoadMore = "LoadMore"
}
export interface LoadState<R> {
    action?: LoadAction;
    rawResponse?: R;
    loading?: boolean;
    loadingError?: HttpErrorResponse | Status;
}
export interface ListParams extends StringMap {
    limit: string;
    continue: string;
}
export interface StreamListLoader<R, T> {
    loadState$: Observable<LoadState<R>>;
    loading$: Observable<boolean>;
    loadingError$: Observable<HttpErrorResponse | Status>;
    hasMore$: Observable<boolean>;
    rawResponse$: Observable<R>;
    items$: Observable<T[]>;
    snapshot: StreamListLoaderSnapshot<R, T>;
    loadMore(): void;
    reload(): void;
}
export interface StreamListLoaderSnapshot<R, T> {
    rawResponse?: R;
    loading?: boolean;
    loadingError?: HttpErrorResponse | Status;
    hasMore?: boolean;
    continueToken?: string;
    items?: T[];
}
export interface LoadSnapshot<R, T, Q> extends StreamListLoaderSnapshot<R, T> {
    queryParams?: Q;
}
export {};
