import { BasePlugin } from '../common/BasePlugin';
import { ComputedFieldResource } from './ComputedFieldInterface';
export type OnUpdatePluginStatus = 'ok' | 'error';
export interface PluginResponse {
    status: OnUpdatePluginStatus;
}
export interface OnUpdatePluginResponse<S> extends PluginResponse {
    data: {
        state: S;
    };
}
export interface OnUpdateBatchPluginResponse<S> extends PluginResponse {
    data: {
        state: S;
    };
}
export interface BuildResultPluginResponse<R> extends PluginResponse {
    data: {
        result: R;
    };
}
export interface BaseUserActivity {
}
export interface BaseUserProfile {
}
export interface BaseComputedField {
}
export type DataType = 'USER_ACTIVITY' | 'USER_PROFILE' | 'COMPUTED_FIELD';
export type Operation = 'UPSERT' | 'DELETE';
export interface Update {
    data_type: DataType;
    operation: Operation;
    data: BaseUserActivity | BaseUserProfile | BaseComputedField;
}
export interface RequestData<S> {
    computed_field_id: string;
    state: S;
    update: Update;
}
export interface RequestDataBatch<S> {
    computed_field_id: string;
    state: S;
    updates: Update[];
}
export interface RequestResult<S> {
    computed_field_id: string;
    state: S;
}
export interface ComputedFieldBaseInstanceContext {
    computedField: ComputedFieldResource;
}
export declare abstract class ComputedFieldPlugin<State, Result, UserActivity extends BaseUserActivity, UserProfile extends BaseUserProfile, ComputedField extends BaseComputedField> extends BasePlugin<ComputedFieldBaseInstanceContext> {
    constructor();
    abstract onUpdateActivity(state: State | null, userActivity: UserActivity, instanceContext: ComputedFieldBaseInstanceContext): State | null;
    abstract onUpdateUserProfile(state: State | null, userProfile: UserProfile, operation: Operation, instanceContext: ComputedFieldBaseInstanceContext): State | null;
    abstract onUpdateComputedField(state: State | null, computedField: ComputedField, instanceContext: ComputedFieldBaseInstanceContext): State | null;
    abstract buildResult(state: State | null, instanceContext: ComputedFieldBaseInstanceContext): Result | null;
    protected fetchComputedField(computedFieldId: string): Promise<ComputedFieldResource>;
    protected instanceContextBuilder(computedFieldId: string): Promise<ComputedFieldBaseInstanceContext>;
    protected getInstanceContext(computedFieldId: string): Promise<ComputedFieldBaseInstanceContext>;
    private getUpdateMethod;
    private onUpdateBatch;
    private formatResponse;
    private formatRequestData;
    private initUpdateRoute;
    private initUpdateBatchRoute;
    private initBuildResultRoute;
}
