import * as i0 from '@angular/core';
import { AXPEntity, AXPMenuProvider, AXPMenuProviderContext, AXPSearchCommandProvider, AXPSearchResult, AXPStatusProvider, AXPStatusTransition } from '@acorex/platform/common';
import { AXPEntityDefinitionLoader } from '@acorex/platform/layout/entity';
import { AXPFeatureDefinitionProvider, AXPFeatureDefinitionProviderContext } from '@acorex/platform/core';
import { AXPPermissionDefinitionProvider, AXPPermissionDefinitionProviderContext } from '@acorex/platform/auth';
import { AXStyleColorType } from '@acorex/cdk/common';

declare class AXMAssetManagementAssetEntityModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<AXMAssetManagementAssetEntityModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AXMAssetManagementAssetEntityModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AXMAssetManagementAssetEntityModule>;
}

declare class AXMAssetManagementModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<AXMAssetManagementModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AXMAssetManagementModule, never, [typeof AXMAssetManagementAssetEntityModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AXMAssetManagementModule>;
}

declare const RootConfig: {
    config: {
        i18n: string;
        module: string;
        route: string;
    };
    module: {
        route: string;
        name: string;
        title: string;
        icon: string;
    };
    entities: {
        asset: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
        manualAssetCategory: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
    };
};

declare class AXMAssetManagementEntityProvider implements AXPEntityDefinitionLoader {
    private readonly injector;
    get(moduleName: string, entityName: string): Promise<AXPEntity | null>;
    list(): Promise<{
        name: string;
        module: string;
    }[]>;
}

/**
 * Asset Management Feature Definition Provider.
 * Provides feature definitions for the Asset Management module.
 */
declare class AXMAssetManagementFeatureDefinitionProvider implements AXPFeatureDefinitionProvider {
    provide(context: AXPFeatureDefinitionProviderContext): Promise<void>;
}

declare const AXMAssetManagementFeatureKeys: {
    readonly AssetManagement: "AssetManagement:Feature:Management";
    readonly AdvancedMaintenance: "AssetManagement:Feature:Advanced.Maintenance";
    readonly MaintenanceScheduling: "AssetManagement:Feature:Maintenance.Scheduling";
    readonly InspectionWorkflow: "AssetManagement:Feature:Inspection.Workflow";
};

declare const AXMAssetManagementMenuKeys: {
    readonly Root: "AssetManagement:Menu";
    readonly Assets: "AssetManagement:Menu:Assets";
};

/**
 * Asset Management Menu Provider.
 * Provides menu items for the Asset Management module with permission and feature checks.
 */
declare class AXMAssetManagementMenuProvider implements AXPMenuProvider {
    private readonly entityService;
    provide(context: AXPMenuProviderContext): Promise<void>;
}

/**
 * Asset Management Permission Definition Provider.
 * Provides permission definitions for the Asset Management module.
 */
declare class AXMAssetManagementPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {
    define(context: AXPPermissionDefinitionProviderContext): Promise<void>;
}

declare const AXMAssetManagementPermissionKeys: {
    readonly AssetManagement: {
        readonly Management: "AssetManagement:Permission:AssetManagement.Management";
        readonly Asset: {
            readonly Management: "AssetManagement:Permission:Asset.Management";
            readonly View: "AssetManagement:Permission:Asset.View";
            readonly Create: "AssetManagement:Permission:Asset.Create";
            readonly Update: "AssetManagement:Permission:Asset.Update";
            readonly Delete: "AssetManagement:Permission:Asset.Delete";
        };
    };
};

declare class AXMAssetManagementSearchCommandProvider extends AXPSearchCommandProvider {
    commands: AXPSearchResult[];
}

declare enum AXMAssetStatus {
    Available = "available",
    Inactive = "inactive",
    Suspended = "suspended",
    Transferring = "transferring",
    UnderRepair = "under-repair",
    OutOfOrder = "out-of-order",
    Retired = "retired",
    Archived = "archived"
}
declare class AXMAssetManagementAssetStatusProvider extends AXPStatusProvider {
    readonly key = "asset-management.status.asset";
    readonly statuses: {
        name: AXMAssetStatus;
        title: string;
        icon: string;
        color: AXStyleColorType;
        order: number;
        isInitial: boolean;
        isFinal: boolean;
        generateView: boolean;
    }[];
    readonly transitions: AXPStatusTransition[];
    readonly defaultStatus = AXMAssetStatus.Available;
    static statuses: any;
}

interface AXMAssetManagementAssetEntityModel {
    id: string;
    code: string;
    title: string;
    statusId?: AXMAssetStatus;
    status?: {
        id: AXMAssetStatus;
        title: string;
    };
    ownerId?: string;
    owner?: {
        id: string;
        displayName?: string;
    };
    assignedToEmployeeId?: string;
    assignedToEmployee?: {
        id: string;
        displayName?: string;
    };
    locationId?: string;
    location?: {
        id: string;
        title: string;
    };
    purchaseDate?: string;
    commissionedDate?: string;
    retiredDate?: string;
    serialNumber?: string;
    testTagIdentificationNumber?: string;
    tags?: string[];
    qrCode?: string;
    isBookable?: boolean;
    isRented?: boolean;
    preBookQuestionnaireId?: string;
    postBookQuestionnaireId?: string;
    preBookQuestionnaire?: {
        id: string;
        title: string;
    };
    postBookQuestionnaire?: {
        id: string;
        title: string;
    };
    categoryIds?: string[];
    parentId?: string | null;
    parent?: {
        id: string;
        title: string;
    };
}

export { AXMAssetManagementAssetStatusProvider, AXMAssetManagementEntityProvider, AXMAssetManagementFeatureDefinitionProvider, AXMAssetManagementFeatureKeys, AXMAssetManagementMenuKeys, AXMAssetManagementMenuProvider, AXMAssetManagementModule, AXMAssetManagementPermissionDefinitionProvider, AXMAssetManagementPermissionKeys, AXMAssetManagementSearchCommandProvider, AXMAssetStatus, RootConfig };
export type { AXMAssetManagementAssetEntityModel };
