import { PrismaService } from '../prisma/prisma.service'; import { CreateProductDto } from './dto/create-product.dto'; import { UpdateProductDto } from './dto/update-product.dto'; import { UpsertNutritionDto } from './dto/upsert-nutrition.dto'; import { AiService } from '../ai/ai.service'; import { CategoriesService } from '../categories/categories.service'; export declare class ProductsService { private readonly prisma; private readonly aiService; private readonly categoriesService; constructor(prisma: PrismaService, aiService: AiService, categoriesService: CategoriesService); findAll(filters?: { tag?: string; }): Promise<({ nutrition: { calories: number | null; protein: number | null; fat: number | null; carbohydrates: number | null; salt: number | null; sugar: number | null; fiber: number | null; id: number; productId: number; } | null; tags: ({ tag: { name: string; id: number; }; } & { productId: number; tagId: number; })[]; categoryRef: ({ parent: ({ parent: { name: string; id: number; parentId: number | null; } | null; } & { name: string; id: number; parentId: number | null; }) | null; } & { name: string; id: number; parentId: number | null; }) | null; } & { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; })[]>; findByOwner(userId: number): Promise<{ name: string; categoryId: number | null; canonicalName: string | null; id: number; }[]>; createPrivate(data: CreateProductDto, userId: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; findDuplicateCandidates(): Promise<{ normalizedName: string; count: number; products: { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }[]; }[]>; findOne(id: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; create(data: CreateProductDto, ownerId?: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; update(id: number, data: UpdateProductDto): Promise<{ nutrition: { calories: number | null; protein: number | null; fat: number | null; carbohydrates: number | null; salt: number | null; sugar: number | null; fiber: number | null; id: number; productId: number; } | null; tags: ({ tag: { name: string; id: number; }; } & { productId: number; tagId: number; })[]; } & { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; updateCanonicalName(id: number, canonicalName: string): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; findDeleted(): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }[]>; remove(id: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; permanentDelete(id: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; restore(id: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; private findProductByIdOrThrow; merge(sourceProductId: number, targetProductId: number): Promise<{ message: string; sourceProductId: number; targetProductId: number; movedInventoryCount: number; softDeletedSource: { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }; }>; previewMerge(sourceProductId: number, targetProductId: number): Promise<{ source: { inventoryCount: number; category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }; target: { inventoryCount: number; category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }; outcome: { inventoryItemsToMove: number; sourceWillBeSoftDeleted: boolean; targetWillRemainActive: boolean; }; }>; backfillCanonicalNames(): Promise<{ message: string; updatedCount: number; products: { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }[]; }>; setTags(productId: number, tagNames: string[]): Promise<({ nutrition: { calories: number | null; protein: number | null; fat: number | null; carbohydrates: number | null; salt: number | null; sugar: number | null; fiber: number | null; id: number; productId: number; } | null; tags: ({ tag: { name: string; id: number; }; } & { productId: number; tagId: number; })[]; } & { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }) | null>; upsertNutrition(productId: number, data: UpsertNutritionDto): Promise<{ calories: number | null; protein: number | null; fat: number | null; carbohydrates: number | null; salt: number | null; sugar: number | null; fiber: number | null; id: number; productId: number; }>; findAllTags(): Promise<{ name: string; id: number; }[]>; resetAll(): Promise<{ ok: boolean; }>; bulkUpdate(ids: number[], data: { categoryId?: number | null; }): Promise<{ updated: number; }>; findUncategorized(): Promise<{ id: number; name: string; canonicalName: string | null; }[]>; aiCategorizeBulk(productIds?: number[]): Promise<{ productId: number; productName: string; suggestion: object; }[]>; findPending(): Promise<({ owner: { id: number; username: string; }; categoryRef: ({ parent: { name: string; id: number; parentId: number | null; } | null; } & { name: string; id: number; parentId: number | null; }) | null; } & { category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; })[]>; createPending(data: CreateProductDto, userId: number): Promise<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }>; setStatus(id: number, status: string): import(".prisma/client").Prisma.Prisma__ProductClient<{ category: string | null; status: string; name: string; categoryId: number | null; canonicalName: string | null; id: number; normalizedName: string; isActive: boolean; deletedAt: Date | null; createdAt: Date; updatedAt: Date; ownerId: number; isPrivate: boolean; }, never, import("@prisma/client/runtime/library").DefaultArgs, import(".prisma/client").Prisma.PrismaClientOptions>; }