import * as i0 from '@angular/core';
import { Injector } from '@angular/core';
import * as i1 from '@angular/common';
import * as _acorex_platform_common from '@acorex/platform/common';
import { AXPEntity, AXPMenuProvider, AXPMenuProviderContext, AXPSearchProvider, AXPSearchResult, AXPSystemStatuses, AXPStatusProvider, AXPSystemStatusType, AXPStatusTransition } from '@acorex/platform/common';
import { AXPEntityDefinitionLoader, AXPEntityDefinitionPreloader, AXPEntityPreloadEntity, AXPEntityModel } from '@acorex/platform/layout/entity';
import { AXPPermissionDefinitionProvider, AXPPermissionDefinitionProviderContext } from '@acorex/platform/auth';

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

declare const RootConfig: {
    config: {
        i18n: string;
        module: string;
    };
    module: {
        route: string;
        name: string;
        title: string;
        icon: string;
    };
    entities: {
        brand: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
        productCategory: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
        product: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
        productSku: {
            name: string;
            source: string;
            title: string;
            titlePlural: string;
            icon: string;
        };
    };
};

declare class AXMProductCatalogEntityProvider implements AXPEntityDefinitionLoader, AXPEntityDefinitionPreloader {
    private injector;
    preload(): AXPEntityPreloadEntity[];
    get(moduleName: string, entityName: string): Promise<AXPEntity | null>;
    list(): Promise<{
        name: string;
        module: string;
    }[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AXMProductCatalogEntityProvider, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AXMProductCatalogEntityProvider>;
}

declare class AXMProductCatalogMenuProvider implements AXPMenuProvider {
    private entityService;
    provide(context: AXPMenuProviderContext): Promise<void>;
}

declare const AXPProductCatalogMenuKeys: {
    readonly Root: "ProductCatalog:Menu";
    readonly Products: "ProductCatalog:Menu:Products";
    readonly Brands: "ProductCatalog:Menu:Brands";
    readonly Divider1: "ProductCatalog:Menu:Divider1";
};

declare class AXMProductCatalogSearchCommandProvider implements AXPSearchProvider {
    search(text: string): Promise<AXPSearchResult[]>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AXMProductCatalogSearchCommandProvider, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AXMProductCatalogSearchCommandProvider>;
}

declare class AXPProductCatalogPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {
    private injector;
    private readonly translateService;
    constructor(injector: Injector);
    define(context: AXPPermissionDefinitionProviderContext): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AXPProductCatalogPermissionDefinitionProvider, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AXPProductCatalogPermissionDefinitionProvider>;
}

declare const AXPProductCatalogPermissionKeys: {
    readonly Products: {
        readonly Management: "ProductCatalog:Permission:Products.Management";
        readonly View: "ProductCatalog:Permission:Products.View";
        readonly Create: "ProductCatalog:Permission:Products.Create";
        readonly Edit: "ProductCatalog:Permission:Products.Edit";
        readonly Delete: "ProductCatalog:Permission:Products.Delete";
    };
    readonly Brands: {
        readonly Management: "ProductCatalog:Permission:Brands.Management";
        readonly View: "ProductCatalog:Permission:Brands.View";
        readonly Create: "ProductCatalog:Permission:Brands.Create";
        readonly Edit: "ProductCatalog:Permission:Brands.Edit";
        readonly Delete: "ProductCatalog:Permission:Brands.Delete";
    };
};

interface AXMProductCatalogBrandEntityModel extends AXPEntityModel<string> {
    code?: string;
    title: string;
    description?: string;
    logo?: string;
    manufacturerId?: string;
    manufacturer?: {
        id: string;
        title: string;
    };
    countryOfOrigin?: string;
    website?: string;
    isDisabled?: boolean;
    categoryIds?: string[];
    categories?: Array<{
        id: string;
        title: string;
    }>;
}

type AXMProductCatalogProductStatus = typeof AXPSystemStatuses.Draft.name | typeof AXPSystemStatuses.InReview.name | typeof AXPSystemStatuses.Approved.name | typeof AXPSystemStatuses.Suspended.name | typeof AXPSystemStatuses.Archived.name;
interface AXMProductCatalogProductEntityModel extends AXPEntityModel<string> {
    code?: string;
    title: string;
    shortName?: string;
    description?: string;
    brandId?: string;
    brand?: {
        id: string;
        title: string;
    };
    categoryIds?: string[];
    categories?: Array<{
        id: string;
        title: string;
    }>;
    taxClassId?: string;
    taxClass?: {
        id: string;
        title: string;
    };
    baseCurrencyId?: string;
    baseCurrency?: {
        id: string;
        code: string;
        symbol: string;
    };
    basePrice?: number;
    baseUnitOfMeasureId?: string;
    baseUnitOfMeasure?: {
        id: string;
        code: string;
        title: string;
    };
    weight?: number;
    weightUnitId?: string;
    weightUnit?: {
        id: string;
        code: string;
    };
    length?: number;
    width?: number;
    height?: number;
    dimensionUnitId?: string;
    dimensionUnit?: {
        id: string;
        code: string;
    };
    manufacturerId?: string;
    manufacturer?: {
        id: string;
        title: string;
    };
    images?: string[];
    documents?: string[];
    statusId?: string;
    notes?: string;
}

interface AXMProductCatalogProductSkuEntityModel extends AXPEntityModel<string> {
    sku?: string;
    productId: string;
    product?: {
        id: string;
        title: string;
        code: string;
    };
    variantName?: string;
    description?: string;
    barcode?: string;
    qrCode?: string;
    ean?: string;
    upc?: string;
    price?: number;
    compareAtPrice?: number;
    costPrice?: number;
    weight?: number;
    weightUnitId?: string;
    weightUnit?: {
        id: string;
        code: string;
    };
    length?: number;
    width?: number;
    height?: number;
    dimensionUnitId?: string;
    dimensionUnit?: {
        id: string;
        code: string;
    };
    categoryIds?: string[];
    categories?: Array<{
        id: string;
        title: string;
    }>;
    isDisabled?: boolean;
    isDefault?: boolean;
    images?: string[];
    notes?: string;
}

/**
 * Product status provider defining lifecycle states: Draft, Review, Approved, Suspended, Discontinued.
 * Used by the status plugin to manage product status transitions and metadata.
 */
declare class AXMProductStatusProvider extends AXPStatusProvider {
    readonly key = "product-catalog.status.product";
    readonly defaultStatus = AXPSystemStatusType.Draft;
    readonly statuses: _acorex_platform_common.AXPStatusDefinition[];
    readonly transitions: AXPStatusTransition[];
}

export { AXMProductCatalogEntityProvider, AXMProductCatalogMenuProvider, AXMProductCatalogModule, AXMProductCatalogSearchCommandProvider, AXMProductStatusProvider, AXPProductCatalogMenuKeys, AXPProductCatalogPermissionDefinitionProvider, AXPProductCatalogPermissionKeys, RootConfig };
export type { AXMProductCatalogBrandEntityModel, AXMProductCatalogProductEntityModel, AXMProductCatalogProductSkuEntityModel, AXMProductCatalogProductStatus };
