/**
 * Copyright (c) 2019-2025 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */
import { PluginContext } from '../../../mol-plugin/context.js';
import { StateTransformer } from '../../../mol-state/index.js';
import { ColorTheme } from '../../../mol-theme/color.js';
import { SizeTheme } from '../../../mol-theme/size.js';
import { ParamDefinition as PD } from '../../../mol-util/param-definition.js';
import { StructureRepresentationPresetProvider } from '../../builder/structure/representation-preset.js';
import { StatefulPluginComponent } from '../../component.js';
import { StructureSelectionQuery } from '../../helpers/structure-selection-query.js';
import { StructureRepresentation3D } from '../../transforms/representation.js';
import { StructureHierarchyRef, StructureComponentRef, StructureRef, StructureRepresentationRef } from './hierarchy-state.js';
import { Clip } from '../../../mol-util/clip.js';
export { StructureComponentManager };
interface StructureComponentManagerState {
    options: StructureComponentManager.Options;
}
declare class StructureComponentManager extends StatefulPluginComponent<StructureComponentManagerState> {
    plugin: PluginContext;
    readonly events: {
        optionsUpdated: import("rxjs").Subject<undefined>;
    };
    get currentStructures(): readonly StructureRef[];
    get pivotStructure(): StructureRef | undefined;
    _setSnapshotState(options: StructureComponentManager.Options): void;
    setOptions(options: StructureComponentManager.Options): Promise<void>;
    private updateReprParams;
    private updateInterationProps;
    applyPreset<P extends StructureRepresentationPresetProvider>(structures: ReadonlyArray<StructureRef>, provider: P, params?: StructureRepresentationPresetProvider.Params<P>): Promise<any>;
    private syncPreset;
    clear(structures: ReadonlyArray<StructureRef>): Promise<void>;
    selectThis(components: ReadonlyArray<StructureComponentRef>): void;
    canBeModified(ref: StructureHierarchyRef): boolean;
    modifyByCurrentSelection(components: ReadonlyArray<StructureComponentRef>, action: StructureComponentManager.ModifyAction): Promise<void>;
    toggleVisibility(components: ReadonlyArray<StructureComponentRef>, reprPivot?: StructureRepresentationRef): void;
    removeRepresentations(components: ReadonlyArray<StructureComponentRef>, pivot?: StructureRepresentationRef): Promise<void> | undefined;
    updateRepresentations(components: ReadonlyArray<StructureComponentRef>, pivot: StructureRepresentationRef, params: StateTransformer.Params<StructureRepresentation3D>): Promise<void>;
    /**
     * To update theme for all selected structures, use
     *   plugin.dataTransaction(async () => {
     *      for (const s of structure.hierarchy.selection.structures) await updateRepresentationsTheme(s.componets, ...);
     *   }, { canUndo: 'Update Theme' });
     */
    updateRepresentationsTheme<C extends ColorTheme.BuiltIn, S extends SizeTheme.BuiltIn>(components: ReadonlyArray<StructureComponentRef>, params: StructureComponentManager.UpdateThemeParams<C, S>): Promise<any> | undefined;
    updateRepresentationsTheme<C extends ColorTheme.BuiltIn, S extends SizeTheme.BuiltIn>(components: ReadonlyArray<StructureComponentRef>, params: (c: StructureComponentRef, r: StructureRepresentationRef) => StructureComponentManager.UpdateThemeParams<C, S>): Promise<any> | undefined;
    addRepresentation(components: ReadonlyArray<StructureComponentRef>, type: string): Promise<void> | undefined;
    private tryFindComponent;
    add(params: StructureComponentManager.AddParams, structures?: ReadonlyArray<StructureRef>): Promise<void>;
    applyTheme(params: StructureComponentManager.ThemeParams, structures?: ReadonlyArray<StructureRef>): Promise<void>;
    private modifyComponent;
    updateLabel(component: StructureComponentRef, label: string): void;
    private get dataState();
    private clearComponents;
    constructor(plugin: PluginContext);
}
declare namespace StructureComponentManager {
    const OptionsParams: {
        hydrogens: PD.Select<"all" | "hide-all" | "only-polar">;
        visualQuality: PD.Select<"auto" | "medium" | "high" | "low" | "custom" | "highest" | "higher" | "lower" | "lowest">;
        ignoreLight: PD.BooleanParam;
        materialStyle: PD.Group<PD.Normalize<{
            metalness: number;
            roughness: number;
            bumpiness: number;
        }>>;
        clipObjects: PD.Group<PD.Normalize<{
            variant: Clip.Variant;
            objects: PD.Normalize<{
                type: /*elided*/ any;
                invert: /*elided*/ any;
                position: /*elided*/ any;
                rotation: /*elided*/ any;
                scale: /*elided*/ any;
                transform: /*elided*/ any;
            }>[];
        }>>;
        interactions: PD.Group<PD.Normalize<{
            providers: PD.Normalize<{
                ionic: /*elided*/ any;
                'pi-stacking': /*elided*/ any;
                'cation-pi': /*elided*/ any;
                'halogen-bonds': /*elided*/ any;
                'hydrogen-bonds': /*elided*/ any;
                'weak-hydrogen-bonds': /*elided*/ any;
                hydrophobic: /*elided*/ any;
                'metal-coordination': /*elided*/ any;
            }>;
            contacts: PD.Normalize<{
                lineOfSightDistFactor: /*elided*/ any;
            }>;
        }>>;
        interior: PD.Group<PD.Normalize<{
            color: import("../../../mol-util/color/index.js").Color;
            colorStrength: number;
            substance: PD.Normalize<{
                metalness: number;
                roughness: number;
                bumpiness: number;
            }>;
            substanceStrength: number;
        }>>;
    };
    type Options = PD.Values<typeof OptionsParams>;
    function getAddParams(plugin: PluginContext, params?: {
        pivot?: StructureRef;
        allowNone: boolean;
        hideSelection?: boolean;
        checkExisting?: boolean;
    }): {
        selection: PD.Select<StructureSelectionQuery>;
        representation: PD.Select<string>;
        options: PD.Group<PD.Normalize<{
            label: string;
            checkExisting: boolean;
        }>>;
    };
    type AddParams = {
        selection: StructureSelectionQuery;
        options: {
            checkExisting: boolean;
            label: string;
        };
        representation: string;
    };
    function getThemeParams(plugin: PluginContext, pivot: StructureRef | StructureComponentRef | undefined): {
        selection: PD.Select<StructureSelectionQuery>;
        action: PD.Mapped<PD.NamedParams<PD.Normalize<{
            color: import("../../../mol-util/color/index.js").Color;
        }>, "color"> | PD.NamedParams<PD.Normalize<{
            value: number;
        }>, "emissive"> | PD.NamedParams<PD.Normalize<{
            material: PD.Normalize<{
                metalness: number;
                roughness: number;
                bumpiness: number;
            }>;
        }>, "material"> | PD.NamedParams<PD.Normalize<{
            value: number;
        }>, "transparency"> | PD.NamedParams<PD.Normalize<{
            excludeGroups: ("one" | "two" | "three" | "four" | "five" | "six")[];
        }>, "clipping"> | PD.NamedParams<PD.Normalize<unknown>, "resetColor"> | PD.NamedParams<PD.Normalize<unknown>, "resetMaterial">>;
        representations: PD.MultiSelect<string>;
    };
    type ThemeParams = PD.Values<ReturnType<typeof getThemeParams>>;
    function getRepresentationTypes(plugin: PluginContext, pivot: StructureRef | StructureComponentRef | undefined): [string, string][];
    type ModifyAction = 'union' | 'subtract' | 'intersect';
    interface UpdateThemeParams<C extends ColorTheme.BuiltIn, S extends SizeTheme.BuiltIn> {
        /**
         * this works for any theme name (use 'name as any'), but code completion will break
         */
        color?: C | 'default';
        colorParams?: ColorTheme.BuiltInParams<C>;
        size?: S | 'default';
        sizeParams?: SizeTheme.BuiltInParams<S>;
    }
}
