import * as i0 from '@angular/core';
import { OnInit, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs';
import { PageEvent } from '@angular/material/paginator';
import { MatSnackBar } from '@angular/material/snack-bar';
import { DialogService } from '@myrmidon/ngx-mat-tools';
import { DataPage } from '@myrmidon/ngx-tools';
import { ThesaurusEntry } from '@myrmidon/cadmus-core';
import { NodeFilter, UriNode, GraphService, TripleFilter, UriTriple } from '@myrmidon/cadmus-api';
import { PagedListStoreService } from '@myrmidon/paged-data-browsers';
import { FormControl, FormGroup, FormBuilder } from '@angular/forms';
import { RefLookupService, RefLookupFilter } from '@myrmidon/cadmus-refs-lookup';

/**
 * Graph nodes list repository.
 */
declare class NodeListRepository implements PagedListStoreService<NodeFilter, UriNode> {
    private _graphService;
    private readonly _store;
    private readonly _loading$;
    private readonly _filter$;
    private readonly _linkedNode$;
    private readonly _classNodes$;
    get loading$(): Observable<boolean | undefined>;
    get filter$(): Observable<NodeFilter>;
    get page$(): Observable<DataPage<UriNode>>;
    get linkedNode$(): Observable<UriNode | undefined>;
    get classNodes$(): Observable<UriNode[] | undefined>;
    constructor(_graphService: GraphService);
    getLinkedNode(): UriNode | undefined;
    getClassNodes(): UriNode[];
    loadPage(pageNumber: number, pageSize: number, filter: NodeFilter): Observable<DataPage<UriNode>>;
    reset(): Promise<void>;
    setFilter(filter: NodeFilter): Promise<void>;
    getFilter(): NodeFilter;
    setPage(pageNumber: number, pageSize: number): Promise<void>;
    /**
     * Set the linked node used in filter.
     *
     * @param node The node or undefined.
     */
    setLinkedNode(node?: UriNode): void;
    /**
     * Set the linked node used in filter by its ID.
     *
     * @param id The node ID.
     */
    setLinkedNodeId(id?: number): void;
    /**
     * Add the specified node to the filter class nodes.
     * If the node already exists, nothing is done.
     *
     * @param node The node to add.
     */
    addClassNode(node: UriNode): void;
    /**
     * Set the class node IDs in the filter.
     *
     * @param ids The class nodes IDs or undefined.
     */
    setClassNodeIds(ids?: number[]): void;
    /**
     * Delete the specified node from the filter class nodes.
     * If the node does not exist, nothing is done.
     *
     * @param id The node's ID.
     */
    deleteClassNode(id: number): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<NodeListRepository, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<NodeListRepository>;
}

/**
 * List of graph nodes. This includes a graph node filter, a list, and a graph
 * editor.
 */
declare class GraphNodeListComponent {
    private _repository;
    private _graphService;
    private _dialogService;
    private _snackbar;
    loading$: Observable<boolean | undefined>;
    page$: Observable<DataPage<UriNode>>;
    /**
     * The currently edited node if any.
     */
    readonly editedNode: i0.ModelSignal<UriNode | undefined>;
    /**
     * The optional set of thesaurus entries for node's tags.
     */
    readonly tagEntries: i0.InputSignal<ThesaurusEntry[] | undefined>;
    /**
     * True if this node list should have a walker button for each node.
     */
    readonly hasWalker: i0.InputSignal<boolean | undefined>;
    /**
     * Emitted when walking a specific node is requested.
     */
    readonly nodeWalk: i0.OutputEmitterRef<UriNode>;
    constructor(_repository: NodeListRepository, _graphService: GraphService, _dialogService: DialogService, _snackbar: MatSnackBar);
    onPageChange(event: PageEvent): void;
    addNode(): void;
    editNode(node: UriNode): void;
    onNodeChange(node: UriNode): void;
    onEditorClose(): void;
    deleteNode(node: UriNode): void;
    walkNode(node: UriNode): void;
    reset(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphNodeListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<GraphNodeListComponent, "cadmus-graph-node-list", never, { "editedNode": { "alias": "editedNode"; "required": false; "isSignal": true; }; "tagEntries": { "alias": "tagEntries"; "required": false; "isSignal": true; }; "hasWalker": { "alias": "hasWalker"; "required": false; "isSignal": true; }; }, { "editedNode": "editedNodeChange"; "nodeWalk": "nodeWalk"; }, never, never, true, never>;
}

/**
 * Graph node editor.
 */
declare class GraphNodeEditorComponent {
    /**
     * The node being edited. A new node has ID=0 and no uri.
     */
    readonly node: i0.ModelSignal<UriNode | undefined>;
    /**
     * The optional set of thesaurus entries for node's tags.
     */
    readonly tagEntries: i0.InputSignal<ThesaurusEntry[] | undefined>;
    /**
     * Emitted when the user requested to close the editor.
     */
    readonly editorClose: i0.OutputEmitterRef<void>;
    isNew: boolean;
    uri: FormControl<string | null>;
    label: FormControl<string | null>;
    isClass: FormControl<boolean>;
    tag: FormControl<string | null>;
    form: FormGroup;
    constructor(formBuilder: FormBuilder);
    private updateForm;
    private getNode;
    cancel(): void;
    save(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphNodeEditorComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<GraphNodeEditorComponent, "cadmus-graph-node-editor", never, { "node": { "alias": "node"; "required": false; "isSignal": true; }; "tagEntries": { "alias": "tagEntries"; "required": false; "isSignal": true; }; }, { "node": "nodeChange"; "editorClose": "editorClose"; }, never, never, true, never>;
}

/**
 * Graph nodes list repository.
 */
declare class GraphTripleListRepository implements PagedListStoreService<TripleFilter, UriTriple> {
    private _graphService;
    private readonly _store;
    private readonly _loading$;
    private readonly _filter$;
    private readonly _subjectNode$;
    private readonly _predicateNode$;
    private readonly _objectNode$;
    get loading$(): Observable<boolean | undefined>;
    get filter$(): Observable<TripleFilter>;
    get page$(): Observable<DataPage<UriTriple>>;
    get subjectNode$(): Observable<UriNode | undefined>;
    get predicateNode$(): Observable<UriNode | undefined>;
    get objectNode$(): Observable<UriNode | undefined>;
    constructor(_graphService: GraphService);
    reset(): Promise<void>;
    loadPage(pageNumber: number, pageSize: number, filter: TripleFilter): Observable<DataPage<UriTriple>>;
    setFilter(filter: TripleFilter): Promise<void>;
    getFilter(): TripleFilter;
    setPage(pageNumber: number, pageSize: number): Promise<void>;
    /**
     * Set the node term used in filter.
     *
     * @param node The node or null/undefined.
     * @param type The type: subject, predicate, object.
     */
    setTerm(node: UriNode | null | undefined, type: 'S' | 'P' | 'O'): void;
    /**
     * Set the node term used in filter by its ID.
     *
     * @param id The node ID or null/undefined.
     * @param type The type: subject, predicate, object.
     */
    setTermId(id: number | null | undefined, type: 'S' | 'P' | 'O'): void;
    selectTerm(type: 'S' | 'P' | 'O'): Observable<UriNode | undefined>;
    getTerm(type: 'S' | 'P' | 'O'): UriNode | undefined;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphTripleListRepository, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GraphTripleListRepository>;
}

declare class GraphTripleListComponent {
    private _graphService;
    private _dialogService;
    private _snackbar;
    private _repository;
    page$: Observable<DataPage<UriTriple>>;
    loading$: Observable<boolean | undefined>;
    editedTriple?: UriTriple;
    /**
     * The optional set of thesaurus entries for triple's tags.
     */
    constructor(_graphService: GraphService, _dialogService: DialogService, _snackbar: MatSnackBar, _repository: GraphTripleListRepository);
    onPageChange(event: PageEvent): void;
    addTriple(): void;
    editTriple(triple: UriTriple): void;
    onTripleChange(triple: UriTriple): void;
    onEditorClose(): void;
    deleteTriple(triple: UriTriple): void;
    reset(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphTripleListComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<GraphTripleListComponent, "cadmus-graph-triple-list", never, {}, {}, never, never, true, never>;
}

interface GraphNodeLookupFilter extends RefLookupFilter {
    isClass?: boolean | null;
    tag?: string;
}
/**
 * Graph node lookup service.
 */
declare class GraphNodeLookupService implements RefLookupService {
    private _graphService;
    constructor(_graphService: GraphService);
    lookup(filter: GraphNodeLookupFilter, options?: any): Observable<any[]>;
    getName(item: any): string;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphNodeLookupService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<GraphNodeLookupService>;
}

declare class GraphTripleEditorComponent implements OnInit, OnDestroy {
    lookupService: GraphNodeLookupService;
    private _snackbar;
    private _graphService;
    private _sub?;
    readonly triple: i0.ModelSignal<UriTriple | undefined>;
    /**
     * The optional set of thesaurus entries for triple's tags.
     */
    /**
     * Emitted when the user requested to close the editor.
     */
    readonly editorClose: i0.OutputEmitterRef<void>;
    isNew: boolean;
    subjectNode: FormControl<UriNode | null>;
    predicateNode: FormControl<UriNode | null>;
    objectNode: FormControl<UriNode | null>;
    isLiteral: FormControl<boolean>;
    literal: FormControl<string | null>;
    literalLang: FormControl<string | null>;
    literalType: FormControl<string | null>;
    tag: FormControl<string | null>;
    form: FormGroup;
    constructor(formBuilder: FormBuilder, lookupService: GraphNodeLookupService, _snackbar: MatSnackBar, _graphService: GraphService);
    ngOnInit(): void;
    ngOnDestroy(): void;
    onSubjectChange(node?: unknown): void;
    onPredicateChange(node?: unknown): void;
    onObjectChange(node?: unknown): void;
    private getNode;
    private updateForm;
    private getTriple;
    cancel(): void;
    save(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<GraphTripleEditorComponent, never>;
    static ɵcmp: i0.ɵɵComponentDeclaration<GraphTripleEditorComponent, "cadmus-graph-triple-editor", never, { "triple": { "alias": "triple"; "required": false; "isSignal": true; }; }, { "triple": "tripleChange"; "editorClose": "editorClose"; }, never, never, true, never>;
}

export { GraphNodeEditorComponent, GraphNodeListComponent, GraphNodeLookupService, GraphTripleEditorComponent, GraphTripleListComponent, GraphTripleListRepository, NodeListRepository };
export type { GraphNodeLookupFilter };
