import { Signal } from '@angular/core';
import { Observable } from 'rxjs';
/**
 * Estrategia de paginacion.
 */
export type PaginationStrategy = 'offset' | 'cursor' | 'page';
/**
 * Estado de paginacion.
 */
export interface PaginationState<T> {
    /** Items actuales */
    items: T[];
    /** Pagina actual (para estrategia offset/page) */
    page: number;
    /** Tamano de pagina */
    pageSize: number;
    /** Conteo total (si se conoce) */
    total?: number;
    /** Cursor para siguiente pagina (para estrategia cursor) */
    nextCursor?: unknown;
    /** Cursor para pagina anterior */
    prevCursor?: unknown;
    /** Si existen mas items */
    hasMore: boolean;
    /** Estado de carga */
    isLoading: boolean;
    /** Estado de error */
    error?: Error;
}
/**
 * Parametros para funcion de carga.
 */
export interface PaginationLoadParams {
    /** Estrategia de paginacion */
    strategy: PaginationStrategy;
    /** Numero de pagina */
    page: number;
    /** Tamano de pagina */
    pageSize: number;
    /** Cursor (para estrategia cursor) */
    cursor?: unknown;
    /** Direccion de carga */
    direction: 'forward' | 'backward';
}
/**
 * Resultado de funcion de carga.
 */
export interface PaginationLoadResult<T> {
    /** Items cargados */
    items: T[];
    /** Si hay mas items */
    hasMore: boolean;
    /** Total de items (opcional) */
    total?: number;
    /** Cursor para siguiente pagina */
    nextCursor?: unknown;
    /** Cursor para pagina anterior */
    prevCursor?: unknown;
}
/**
 * Configuracion para crear un controlador de paginacion.
 */
export interface PaginationConfig<T> {
    /** Estrategia de paginacion */
    strategy: PaginationStrategy;
    /** Tamano de pagina */
    pageSize?: number;
    /** Items iniciales (opcional) */
    initialItems?: T[];
    /** Funcion de carga */
    loadFn: (params: PaginationLoadParams) => Observable<PaginationLoadResult<T>> | Promise<PaginationLoadResult<T>>;
    /** Funcion de tracking para items */
    trackBy?: (item: T) => unknown;
}
/**
 * Interface del controlador de paginacion.
 */
export interface PaginationController<T> {
    /** Estado reactivo como signal */
    state: Signal<PaginationState<T>>;
    /** Signal de items (accessor de conveniencia) */
    items: Signal<T[]>;
    /** Signal de carga */
    isLoading: Signal<boolean>;
    /** Signal de mas items */
    hasMore: Signal<boolean>;
    /** Signal de error */
    error: Signal<Error | null>;
    /** Signal de pagina actual */
    currentPage: Signal<number>;
    /** Signal de total */
    total: Signal<number | undefined>;
    /** Cargar siguiente pagina */
    loadNext(): Promise<void>;
    /** Cargar pagina anterior (si soportado) */
    loadPrevious(): Promise<void>;
    /** Refresh (recargar desde inicio) */
    refresh(): Promise<void>;
    /** Reset a estado inicial */
    reset(): void;
    /** Actualizar un item */
    updateItem(predicate: (item: T) => boolean, updates: Partial<T>): void;
    /** Remover un item */
    removeItem(predicate: (item: T) => boolean): void;
    /** Agregar items al inicio */
    prependItems(items: T[]): void;
    /** Agregar items al final */
    appendItems(items: T[]): void;
}
/**
 * Estado inicial para controladores de paginacion.
 */
export declare function createInitialPaginationState<T>(pageSize: number, initialItems?: T[]): PaginationState<T>;
