import { TemplateRef } from '@angular/core';
import { Color } from '@ionic/core';
import { Observable } from 'rxjs';
import { SkeletonTemplateName, SkeletonTemplateConfig } from '../../../services/skeleton/types';
import { RefresherMetadata } from '../../molecules/refresher/types';
/**
 * Direccion de carga de mas items.
 */
export type LoadDirection = 'bottom' | 'top' | 'both';
/**
 * Estado de la lista infinita.
 */
export type InfiniteListState = 'idle' | 'loading' | 'error' | 'complete';
/**
 * Parametros pasados a la funcion de carga.
 */
export interface LoadParams {
    /** Direccion de carga */
    direction: 'bottom' | 'top';
    /** Pagina actual (para paginacion basada en offset) */
    page: number;
    /** Items por pagina */
    pageSize: number;
    /** Ultimo item (para paginacion basada en cursor) */
    lastItem?: unknown;
    /** Primer item (para carga top con cursor) */
    firstItem?: unknown;
    /** Cursor personalizado (del LoadResult anterior) */
    cursor?: unknown;
}
/**
 * Resultado de la funcion de carga.
 */
export interface LoadResult<T> {
    /** Items cargados */
    items: T[];
    /** Si hay mas items disponibles */
    hasMore: boolean;
    /** Cursor personalizado para proxima carga (opcional) */
    cursor?: unknown;
    /** Actualizacion de conteo total (opcional) */
    totalCount?: number;
}
/**
 * Configuracion del data source.
 */
export interface InfiniteListDataSource<T> {
    /** Items iniciales (opcional si usa loadFn) */
    items?: T[];
    /** Funcion para cargar mas items */
    loadFn?: (params: LoadParams) => Observable<LoadResult<T>> | Promise<LoadResult<T>>;
    /** Funcion track para ngFor (default: index) */
    trackBy?: (index: number, item: T) => unknown;
    /** Conteo total si se conoce (habilita indicador de progreso) */
    totalCount?: number;
}
/**
 * Evento emitido al cargar mas items.
 */
export interface LoadMoreEvent {
    /** Parametros de carga */
    params: LoadParams;
    /** Llamar cuando la carga completa */
    complete: (result: LoadResult<unknown>) => void;
    /** Llamar cuando la carga falla */
    error: (error: Error) => void;
}
/**
 * Configuracion de estado vacio.
 */
export interface InfiniteListEmptyState {
    /** Nombre del icono */
    icon?: string;
    /** Texto del titulo */
    title?: string;
    /** Texto del mensaje */
    message?: string;
    /** Template personalizado */
    template?: TemplateRef<void>;
    titleKey?: string;
    messageKey?: string;
    contentClass?: string;
}
/**
 * Configuracion de estado de error.
 */
export interface InfiniteListErrorState {
    /** Icono de error */
    icon?: string;
    /** Titulo del error */
    title?: string;
    /** Mensaje del error */
    message?: string;
    /** Mostrar boton de reintentar */
    showRetry?: boolean;
    /** Texto del boton de reintentar */
    retryText?: string;
    /** Template personalizado */
    template?: TemplateRef<{
        error: Error;
        retry: () => void;
    }>;
    titleKey?: string;
    messageKey?: string;
    retryTextKey?: string;
    contentClass?: string;
}
/**
 * Configuracion de skeleton para carga.
 */
export interface InfiniteListSkeletonConfig {
    /** Template de skeleton a usar */
    template?: SkeletonTemplateName | string;
    /** Numero de items skeleton a mostrar */
    count?: number;
    /** Template personalizado */
    customTemplate?: TemplateRef<void>;
    /** Configuracion adicional */
    config?: SkeletonTemplateConfig;
}
/**
 * Contexto para el template de items.
 */
export interface InfiniteListItemContext<T> {
    /** El item actual */
    $implicit: T;
    /** Indice del item */
    index: number;
    /** Si es el primer item */
    first: boolean;
    /** Si es el ultimo item */
    last: boolean;
    /** Items totales */
    count: number;
}
/**
 * Metadata para el componente val-infinite-list.
 */
export interface InfiniteListMetadata<T = unknown> {
    /** Configuracion del data source */
    dataSource: InfiniteListDataSource<T>;
    /** Direccion de carga */
    direction?: LoadDirection;
    /** Items por pagina (default: 20) */
    pageSize?: number;
    /** Distancia del borde para activar carga (default: '100px') */
    threshold?: string;
    /** Tiempo de debounce para eventos de carga en ms (default: 300) */
    debounceTime?: number;
    /** Cargar primera pagina automaticamente al inicializar (default: true) */
    autoLoad?: boolean;
    /** Template para renderizar cada item (requerido) */
    itemTemplate: TemplateRef<InfiniteListItemContext<T>>;
    /** Template para el indicador de carga en bottom */
    loadingTemplate?: TemplateRef<void>;
    /** Template para el indicador de carga en top */
    topLoadingTemplate?: TemplateRef<void>;
    /** Configuracion de estado vacio */
    emptyState?: InfiniteListEmptyState;
    /** Configuracion de estado de error */
    errorState?: InfiniteListErrorState;
    /** Configuracion de skeleton para carga inicial */
    skeleton?: InfiniteListSkeletonConfig;
    /** Tipo de spinner */
    spinnerType?: 'circular' | 'crescent' | 'dots' | 'lines-sharp';
    /** Color del spinner */
    color?: Color;
    /** Usar boton "Cargar mas" en lugar de auto-carga */
    useLoadMoreButton?: boolean;
    /** Texto del boton "Cargar mas" */
    loadMoreText?: string;
    /** Texto cuando no hay mas items */
    noMoreText?: string;
    /** Habilitar pull-to-refresh */
    enableRefresh?: boolean;
    /** Configuracion del refresher */
    refreshConfig?: RefresherMetadata;
    /** Clase CSS para el contenedor */
    cssClass?: string;
    /** Altura maxima (habilita scroll interno) */
    maxHeight?: string;
    /** Mostrar divisores entre items */
    showDividers?: boolean;
    /** ARIA label para la lista */
    ariaLabel?: string;
    /** ARIA description */
    ariaDescription?: string;
    /** Identificador unico */
    token?: string;
    loadMoreTextKey?: string;
    noMoreTextKey?: string;
    contentClass?: string;
}
/**
 * Valores por defecto para infinite list.
 */
export declare const DEFAULT_INFINITE_LIST_METADATA: Partial<InfiniteListMetadata>;
