/// <reference types="@rbxts/compiler-types" />
/// <reference types="@rbxts/compiler-types" />
/// <reference types="@rbxts/types" />
/// <reference types="@rbxts/compiler-types" />
import { Modding, OnStart } from "@flamework/core";
import { BaseComponent, Components } from "@flamework/components";
import { TycoonService } from "../TycoonService";
import { BaseTycoonComponent } from "../BaseTycoonComponent";
import { TycoonLogger } from "../TycoonLogger";
import { Constructor } from "@flamework/components/out/utility";
import { AbstractConstructor } from "@flamework/core/out/utility";
type InferBaseTycoonGenerics<T extends BaseTycoonItem<any, any, any>> = T extends BaseTycoonItem<infer A, infer I, infer D> ? [A, I, D] : never;
type AttrubutesGuard<T extends BaseTycoonItem<any, any, any>> = Required<{
    [K in keyof InferBaseTycoonGenerics<T>[0]]: Modding.Generic<InferBaseTycoonGenerics<T>[0][K], "guard">;
}>;
export interface TycoonItemConfig {
    tag?: string;
}
export interface TycoonItemMetadata<T extends BaseTycoonItem = BaseTycoonItem> {
    AttributesGuard: AttrubutesGuard<T>;
    InstanceGuard: Modding.Generic<InferBaseTycoonGenerics<T>[1], "guard">;
    DataGuard: Modding.Generic<InferBaseTycoonGenerics<T>[2], "guard">;
}
export declare const DecoratedTycoonItems: Set<Constructor<BaseTycoonItem<any, any, any>>>;
/**
 * Register a class as a tycoon item.
 *
 * @metadata reflect identifier flamework:implements flamework:parameters injectable macro
 */
export declare const TycoonItem: <T extends BaseTycoonItem<{}, Instance, {}>>(config?: TycoonItemConfig, metadata?: Modding.Many<TycoonItemMetadata<T>>) => (ctor: AbstractConstructor<T>) => void;
interface Attributes {
    Id?: string;
}
export declare abstract class BaseTycoonItem<A extends Attributes = {}, I extends Instance = Instance, D extends {} = {}> extends BaseComponent<A, I> implements OnStart {
    readonly TycoonService: TycoonService;
    private logger;
    private components;
    private _tycoon;
    private __janitor;
    private isLocked;
    private baseParent;
    private id;
    private isDestroyed;
    private dataGuard;
    constructor(TycoonService: TycoonService, logger: TycoonLogger, components: Components);
    onStart(): void;
    onSetup(): void;
    protected GetTycoon(): BaseTycoonComponent<{}, Model, import("../../utility").ITycoonData>;
    private initEvents;
    private validateData;
    private initLockState;
    private haveLockTag;
    private initId;
    protected mutateData(newData: D): void;
    private clearData;
    protected abstract generateData(): D;
    GetId(): string;
    GetData(): D;
    TryGetData(): D | undefined;
    IsLocked(): boolean;
    protected onAppear(): Promise<void>;
    protected onDisappear(): Promise<void>;
    protected onDestroyed(): void;
    Disappear(): void;
    Appear(): void;
    protected setParentWhenUnlocked(): void;
    protected setParentWhenLocked(): void;
    /** @hidden */
    destroy(): void;
}
export {};
