import { Observable, BehaviorSubject } from 'rxjs';
import * as i2 from '@progress/kendo-angular-grid';
import { PagerSettings, GridComponent } from '@progress/kendo-angular-grid';
import * as i0 from '@angular/core';
import { OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, EventEmitter } from '@angular/core';
import { ODataState, ODataResult, ODataService, Expander, Computation } from 'imng-kendo-odata';
import * as i3 from 'imng-kendo-grid';
import { KendoGridBaseComponent, GridStateChangeEvent } from 'imng-kendo-grid';
import { Router } from '@angular/router';
import { Subscribable, Subscriptions } from 'imng-ngrx-utils';
import { CompositeFilterDescriptor, FilterDescriptor } from '@progress/kendo-data-query';
import { ICompositeFilter, IFilter } from 'imng-odata-client';
import * as i1 from '@angular/common';
import * as _progress_kendo_svg_icons from '@progress/kendo-svg-icons';

interface IKendoODataGridFacade<Entity> {
    loading$: Observable<boolean>;
    gridODataState$: Observable<ODataState | undefined>;
    gridData$: Observable<ODataResult<Entity> | undefined>;
    gridPagerSettings$: Observable<false | PagerSettings>;
    loadEntities(state: ODataState): void;
    reloadEntities(state?: ODataState): void;
}

declare abstract class KendoODataBasedComponent<ENTITY extends object, FACADE extends IKendoODataGridFacade<ENTITY>> extends KendoGridBaseComponent<ENTITY> implements OnInit, OnDestroy, Subscribable {
    readonly facade: FACADE;
    readonly state: ODataState | Observable<ODataState>;
    readonly router: Router | null;
    readonly gridRefresh$: Observable<unknown> | null;
    useLoadAllDataExport: boolean;
    odataService: ODataService;
    odataEndpoint?: string;
    /**
     * This sets the amount of the maximum amount of sortable columns for this component.  Default = 5.
     */
    maxSortedColumnCount: number;
    /**
     * This will allow you to provide a visual indicator that some of the columns have been hidden.
     */
    hasHiddenColumns$: Observable<boolean>;
    loadDataProgression$: BehaviorSubject<number>;
    gridStateQueryKey: string;
    gridDataState: ODataState;
    gridDataResult$: Observable<ODataResult<ENTITY>>;
    loading$: Observable<boolean>;
    gridPagerSettings$: Observable<false | PagerSettings>;
    /**
     * A properties enum to make kendo grid columns definitions type safe
     * {@example <kendo-grid-column [field]="props.FIELD_NAME">}
     */
    abstract readonly props: any;
    protected expanders?: Expander[];
    protected compute?: (string | Computation)[];
    protected transformations?: string;
    /**
     * The default filter descriptor is set by developer in the constructor initialization.
     * This is used to reset the filter when the "Clear Filter" button is clicked.
     *
     * @public
     * @type {CompositeFilterDescriptor | ICompositeFilter | undefined}
     */
    defaultFilter: CompositeFilterDescriptor | ICompositeFilter | undefined;
    constructor(facade: FACADE, state: ODataState | Observable<ODataState>, router?: Router | null, //NOSONAR
    gridRefresh$?: Observable<unknown> | null);
    ngOnInit(): void;
    deserializeODataState(stateQueryParam: string): ODataState;
    /**
     * This method ensures the proper handling of date filters in an OData query
     * @param filter
     */
    normalizeFilters(filter: FilterDescriptor | CompositeFilterDescriptor | IFilter | ICompositeFilter): void;
    serializeODataState(odataState: ODataState): string;
    /**
     * Will reset filters to initialGrid state passed into the constructor
     */
    resetFilters(): void;
    dataStateChange(state: GridStateChangeEvent | ODataState): void;
    /**
     * Gets an Observable of all data for Excel export.
     *
     * Returns all data from the OData endpoint if the endpoint is available and
     * `useLoadAllDataExport` is enabled, otherwise returns the current grid data result.
     *
     * @returns {Observable<ODataResult<ENTITY>>} An Observable containing the OData result with entity data
     */
    excelData: () => Observable<ODataResult<ENTITY>>;
    /**
     * Loads all data from the OData service by fetching data in chunks of 100 items.
     *
     * This method retrieves the current grid data and OData state, then creates multiple
     * OData queries to fetch all available data in batches. Each batch is limited to 100 items
     * to manage memory and performance. The results from all batches are accumulated and returned
     * as a single ODataResult.
     *
     * @returns {Observable<ODataResult<ENTITY>>} An observable that emits the complete accumulated result
     *          containing the total count and combined data from all fetched batches. After emission,
     *          sets the useLoadAllDataExport flag to false.
     *
     * @remarks
     * - Uses `concatMap` to ensure requests are processed sequentially
     * - Uses `scan` to accumulate results from each batch
     * - Count is disabled on subsequent requests (count: false) to optimize performance
     * - The useLoadAllDataExport flag is reset to false upon completion
     */
    loadAllData(): Observable<ODataResult<ENTITY>>;
    loadEntities(odataState: ODataState): void;
    validateSortParameters(state: ODataState): ODataState;
    updateRouterState(state: ODataState): void;
    reloadEntities(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<KendoODataBasedComponent<any, any>, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<KendoODataBasedComponent<any, any>, "ng-component", never, {}, {}, never, never, true, never>;
}

interface KendoODataGridState<Entity> {
    gridData: ODataResult<Entity>;
    loading: boolean;
    gridODataState: ODataState;
    /** Last known error (if any) */
    error: unknown | undefined;
    gridPagerSettings: PagerSettings | false;
}

declare const getODataPagerSettings: <T>(m: {
    gridData: ODataResult<T>;
    gridODataState?: ODataState;
}) => false | PagerSettings;
declare const mapPagerSettings: <T>() => (source: Observable<{
    gridData: ODataResult<T>;
    gridODataState?: ODataState;
}>) => Observable<false | PagerSettings>;

declare function createKendoODataGridInitialState<TEntity>(): KendoODataGridState<TEntity>;

declare class IMNG_KENDO_GRID_ODATA implements OnInit, AfterViewInit, OnDestroy, Subscribable {
    readonly gridComponent: GridComponent;
    readonly changeDetectorRef: ChangeDetectorRef;
    readonly allSubscriptions: Subscriptions;
    private facade;
    odataComponent: KendoODataBasedComponent<object, IKendoODataGridFacade<object>>;
    ngOnInit(): void;
    ngAfterViewInit(): void;
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<IMNG_KENDO_GRID_ODATA, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<IMNG_KENDO_GRID_ODATA, "[imngODataGrid]", never, { "odataComponent": { "alias": "imngODataGrid"; "required": false; }; }, {}, never, never, true, never>;
}

declare class IMNG_KENDO_GRID_ODATA_HEADER implements OnInit {
    parentGrid: GridComponent;
    readonly exportIcon: _progress_kendo_svg_icons.SVGIcon;
    readonly filePdfIcon: _progress_kendo_svg_icons.SVGIcon;
    readonly plusIcon: _progress_kendo_svg_icons.SVGIcon;
    readonly fileExcelIcon: _progress_kendo_svg_icons.SVGIcon;
    readonly filterClearIcon: _progress_kendo_svg_icons.SVGIcon;
    readonly arrowRotateCcwIcon: _progress_kendo_svg_icons.SVGIcon;
    imngODataGrid: KendoODataBasedComponent<object, IKendoODataGridFacade<object>>;
    loadDataProgression$: BehaviorSubject<number>;
    exportOptions: {
        name: string;
        command: string;
        click: () => void;
        svgIcon?: unknown;
    }[];
    entityName: string;
    hideColumnChooser: boolean;
    hideResetFilters: boolean;
    hideReloadData: boolean;
    hideExports: boolean;
    hasHiddenColumns$: Observable<boolean> | undefined;
    addItemClicked: EventEmitter<any>;
    resetFiltersClicked: EventEmitter<any>;
    reloadEntitiesClicked: EventEmitter<any>;
    ngOnInit(): void;
    configureGridForLoadAllData(exportCallback: (gridComponent: GridComponent) => void): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<IMNG_KENDO_GRID_ODATA_HEADER, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<IMNG_KENDO_GRID_ODATA_HEADER, "imng-kendo-grid-odata-header", never, { "imngODataGrid": { "alias": "imngODataGrid"; "required": true; }; "entityName": { "alias": "entityName"; "required": false; }; "hideColumnChooser": { "alias": "hideColumnChooser"; "required": false; }; "hideResetFilters": { "alias": "hideResetFilters"; "required": false; }; "hideReloadData": { "alias": "hideReloadData"; "required": false; }; "hideExports": { "alias": "hideExports"; "required": false; }; "hasHiddenColumns$": { "alias": "hasHiddenColumns$"; "required": false; }; }, { "addItemClicked": "addItemClicked"; "resetFiltersClicked": "resetFiltersClicked"; "reloadEntitiesClicked": "reloadEntitiesClicked"; }, never, never, true, never>;
}

declare class ImngKendoGridODataModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<ImngKendoGridODataModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<ImngKendoGridODataModule, never, [typeof i1.CommonModule, typeof i2.PDFModule, typeof i2.ExcelModule, typeof i3.ImngKendoGridModule, typeof IMNG_KENDO_GRID_ODATA, typeof IMNG_KENDO_GRID_ODATA_HEADER], [typeof IMNG_KENDO_GRID_ODATA, typeof IMNG_KENDO_GRID_ODATA_HEADER]>;
    static ɵinj: i0.ɵɵInjectorDeclaration<ImngKendoGridODataModule>;
}

export { IMNG_KENDO_GRID_ODATA, IMNG_KENDO_GRID_ODATA_HEADER, ImngKendoGridODataModule, KendoODataBasedComponent, createKendoODataGridInitialState, getODataPagerSettings, mapPagerSettings };
export type { IKendoODataGridFacade, KendoODataGridState };
