import { ApolloClient } from "@apollo/client/core";
import { ExpressionRendered } from "../expression/Expression";
import { ExpressionClient } from "../expression/ExpressionClient";
import { Link, LinkExpressionInput, LinkExpression, LinkInput, LinkMutations, LinkExpressionMutations } from "../links/Links";
import { NeighbourhoodClient } from "../neighbourhood/NeighbourhoodClient";
import { NeighbourhoodProxy } from "../neighbourhood/NeighbourhoodProxy";
import { LinkQuery } from "./LinkQuery";
import { Perspective } from "./Perspective";
import { PerspectiveHandle, PerspectiveState } from "./PerspectiveHandle";
import { LinkStatus, PerspectiveProxy } from './PerspectiveProxy';
export type PerspectiveHandleCallback = (perspective: PerspectiveHandle) => null;
export type UuidCallback = (uuid: string) => null;
export type LinkCallback = (link: LinkExpression) => null;
export type SyncStateChangeCallback = (state: PerspectiveState) => null;
export declare class PerspectiveClient {
    #private;
    constructor(client: ApolloClient<any>, subscribe?: boolean);
    setExpressionClient(client: ExpressionClient): void;
    setNeighbourhoodClient(client: NeighbourhoodClient): void;
    all(): Promise<PerspectiveProxy[]>;
    byUUID(uuid: string): Promise<PerspectiveProxy | null>;
    snapshotByUUID(uuid: string): Promise<Perspective | null>;
    publishSnapshotByUUID(uuid: string): Promise<string | null>;
    queryLinks(uuid: string, query: LinkQuery): Promise<LinkExpression[]>;
    queryProlog(uuid: string, query: string): Promise<any>;
    add(name: string): Promise<PerspectiveProxy>;
    update(uuid: string, name: string): Promise<PerspectiveProxy>;
    remove(uuid: string): Promise<{
        perspectiveRemove: boolean;
    }>;
    addLink(uuid: string, link: Link, status?: LinkStatus): Promise<LinkExpression>;
    addLinks(uuid: string, links: Link[], status?: LinkStatus): Promise<LinkExpression[]>;
    removeLinks(uuid: string, links: LinkExpressionInput[]): Promise<LinkExpression[]>;
    linkMutations(uuid: string, mutations: LinkMutations, status?: LinkStatus): Promise<LinkExpressionMutations>;
    addLinkExpression(uuid: string, link: LinkExpressionInput, status?: LinkStatus): Promise<LinkExpression>;
    updateLink(uuid: string, oldLink: LinkExpressionInput, newLink: LinkInput): Promise<LinkExpression>;
    removeLink(uuid: string, link: LinkExpressionInput): Promise<{
        perspectiveRemoveLink: boolean;
    }>;
    addSdna(uuid: string, name: string, sdnaCode: string, sdnaType: "subject_class" | "flow" | "custom"): Promise<boolean>;
    executeCommands(uuid: string, commands: string, expression: string, parameters: string): Promise<boolean>;
    createSubject(uuid: string, subjectClass: string, expressionAddress: string): Promise<boolean>;
    getSubjectData(uuid: string, subjectClass: string, expressionAddress: string): Promise<string>;
    getExpression(expressionURI: string): Promise<ExpressionRendered>;
    createExpression(content: any, languageAddress: string): Promise<string>;
    addPerspectiveAddedListener(cb: PerspectiveHandleCallback): void;
    subscribePerspectiveAdded(): void;
    addPerspectiveUpdatedListener(cb: PerspectiveHandleCallback): void;
    subscribePerspectiveUpdated(): void;
    addPerspectiveSyncedListener(cb: SyncStateChangeCallback): void;
    addPerspectiveSyncStateChangeListener(uuid: String, cb: SyncStateChangeCallback[]): Promise<void>;
    addPerspectiveRemovedListener(cb: UuidCallback): void;
    subscribePerspectiveRemoved(): void;
    addPerspectiveLinkAddedListener(uuid: String, cb: LinkCallback[]): Promise<void>;
    addPerspectiveLinkRemovedListener(uuid: String, cb: LinkCallback[]): Promise<void>;
    addPerspectiveLinkUpdatedListener(uuid: String, cb: LinkCallback[]): Promise<void>;
    getNeighbourhoodProxy(uuid: string): NeighbourhoodProxy;
}
