import { prisma } from "@/core/prisma";
import { tracked } from "@/core/tracked";
import { AppError } from "@/core/AppError";

export const ingredientService = {
    findAll(shopId: string) {
        return prisma.ingredient.findMany({
            where: { shopId, active: true },
            orderBy: { name: "asc" },
        });
    },

    findAllIncludingInactive(shopId: string) {
        return prisma.ingredient.findMany({
            where: { shopId },
            orderBy: { name: "asc" },
        });
    },

    findById(shopId: string, id: string) {
        return prisma.ingredient.findFirst({
            where: { id, shopId },
        });
    },

    async create(shopId: string, data: any, userId?: string, senderSocketId?: string) {
        const ingredient = await prisma.ingredient.create({
            data: { ...data, shopId },
        });

        const t = tracked({ shopId, entity: "Ingredient", actorUserId: userId, senderSocketId });
        await t.emit(
            "ingredient.created",
            { ingredientId: ingredient.id, name: data.name, allergen: data.allergen, extraPrice: data.extraPrice },
            ingredient.id,
            1
        );

        return ingredient;
    },

    async update(shopId: string, id: string, data: any, userId?: string, senderSocketId?: string) {
        const existing = await prisma.ingredient.findFirst({
            where: { id, shopId },
        });

        if (!existing) {
            throw new AppError("Ingredient not found", 404);
        }

        const updated = await prisma.ingredient.update({
            where: { id },
            data,
        });

        const t = tracked({ shopId, entity: "Ingredient", actorUserId: userId, senderSocketId });
        await t.emit(
            "ingredient.updated",
            { ingredientId: id, changes: Object.keys(data), newValues: data },
            id,
            1
        );

        return updated;
    },

    async softDelete(shopId: string, id: string, userId?: string, senderSocketId?: string) {
        const existing = await prisma.ingredient.findFirst({
            where: { id, shopId },
        });

        if (!existing) {
            throw new AppError("Ingredient not found", 404);
        }

        const updated = await prisma.ingredient.update({
            where: { id },
            data: { active: false },
        });

        const t = tracked({ shopId, entity: "Ingredient", actorUserId: userId, senderSocketId });
        await t.emit(
            "ingredient.deleted",
            { ingredientId: id, name: existing.name },
            id,
            1
        );

        return updated;
    },
};
