import { EnterprisePropertyDefinition, IExtendApiManifestWithConfiguration, PropertyBindingProviderId, PropertyDataSourceId, PropertyDefinition, PropertyValuePrimitiveConverter } from "@omnia/fx-models";
import { GuidValue } from "../../../shared/models";
import { VueComponentBase } from "../../VueComponentBase";
import { PropertyDefinitionId, PropertySettings } from "./Properties";
import { IPropertyDataSourceRegistrationApi } from "./DataSource";
import { DataSourcePropertyDefintionHandlerId } from "@omnia/fx/services";
import { IPropertyBindingProviderRegistrationApi } from "./PropertyBindingProvider";
export type PropertyRegistrationId = GuidValue;
export interface PropertyRegistration {
    id: PropertyRegistrationId;
    title: string;
    settingsElement?: string;
    properties?: Array<new () => PropertyDefinition<any, any, any>>;
    enterpriseProperties?: EnterprisePropertyDefinition[];
}
export interface PropertyProviderBaseConstructor {
    componentRef: VueComponentBase;
    propertyId: PropertyDefinitionId;
    propertySettings?: PropertySettings;
}
export interface IPropertyRegistrationApi {
    register(registration: PropertyRegistration): void;
}
export interface IPropertyDefinitionRegistrationApi {
    register<TPropertyDef extends PropertyDefinition<any, any, any>>(propertyDefinitionConstructor: new () => TPropertyDef, readRenderComponentManifestId: GuidValue, editRendererComponentManifestId: GuidValue, propertyValuePrimitiveConverterCtor: new () => PropertyValuePrimitiveConverter, configurationRendererComponentManifestId?: GuidValue): any;
    getPropertyDefinitionsByIds(propertyDefinitionIds: Array<PropertyDefinitionId>): Promise<Array<ResolvedPropertyDefinition>>;
    getPropertyDefinitions(): Promise<Array<ResolvedPropertyDefinition>>;
}
export interface ResolvedPropertyDefinition {
    omniaServiceId: GuidValue;
    propertyDefinitionId: GuidValue;
    propertyDefinition: new () => PropertyDefinition<any, any, any>;
    readRenderComponentManifestId: GuidValue;
    editRendererComponentManifestId: GuidValue;
    propertyValuePrimitiveConverterCtor: new () => PropertyValuePrimitiveConverter;
    configurationRendererComponentManifestId?: GuidValue;
}
declare module "@omnia/fx-models" {
    interface IOmniaUxApi {
        properties: {
            definitions: Promise<IPropertyDefinitionRegistrationApi>;
            dataSources: {
                registrations: Promise<IPropertyDataSourceRegistrationApi>;
            };
            bindingProviders: {
                registrations: Promise<IPropertyBindingProviderRegistrationApi>;
            };
        };
    }
    interface IOmniaUxExtendApiManifest {
        properties: {
            definitions: IExtendApiManifestWithConfiguration<PropertyDefinitionId>;
            dataSources: {
                /**
                 * Register the manifest/bundle that contains the propertydatasource
                 * */
                registrations: IExtendApiManifestWithConfiguration<PropertyDataSourceId>;
                /**
                 * Register any external plugin/dataSourcePropertyDefinitionHandler for a property data source
                 * */
                pluginRegistration: IExtendApiManifestWithConfiguration<{
                    dataSourceId: PropertyDataSourceId;
                    dataSourcePropertyDefinitionHandlerId: DataSourcePropertyDefintionHandlerId;
                }>;
            };
            bindingProviders: {
                registrations: IExtendApiManifestWithConfiguration<PropertyBindingProviderId>;
            };
        };
    }
}
