import { Request, Response } from "express";
import { z } from "zod";
import { asyncHandler } from "../../core/asyncHandler";
import { recipeService } from "./recipe.service";

// ── Schemas ──

const recipeIdParams = z.object({ id: z.string().uuid() });

const createRecipeSchema = z.object({
    name: z.string().min(1),
    description: z.string().optional(),
    ingredients: z
        .array(
            z.object({
                ingredientId: z.string().uuid(),
                role: z.enum(["BASE", "DEFAULT", "SUPPLEMENT"]).optional().default("DEFAULT"),
                defaultQuantity: z.number().int().min(1).optional().default(1),
                maxQuantity: z.number().int().min(1).nullable().optional().default(null),
                extraPrice: z.number().int().min(0).optional().default(0),
            })
        )
        .optional(),
});

const updateRecipeSchema = z.object({
    name: z.string().min(1).optional(),
    description: z.string().optional(),
    active: z.boolean().optional(),
});

const setIngredientsSchema = z.object({
    ingredients: z.array(
        z.object({
            ingredientId: z.string().uuid(),
            role: z.enum(["BASE", "DEFAULT", "SUPPLEMENT"]).optional().default("DEFAULT"),
            defaultQuantity: z.number().int().min(1).optional().default(1),
            maxQuantity: z.number().int().min(1).nullable().optional().default(null),
            extraPrice: z.number().int().min(0).optional().default(0),
        })
    ),
});


// ── Recipe CRUD ──

export const listRecipes = asyncHandler(
    async (req: Request, res: Response) => {
        const recipes = await recipeService.findAll(req.shop!.id);
        res.json(recipes);
    }
);

export const getRecipe = asyncHandler(
    async (req: Request, res: Response) => {
        const { id } = recipeIdParams.parse(req.params);
        const recipe = await recipeService.findById(req.shop!.id, id);
        if (!recipe)
            return res.status(404).json({ message: "Recipe not found" });
        res.json(recipe);
    }
);

export const createRecipe = asyncHandler(
    async (req: Request, res: Response) => {
        const data = createRecipeSchema.parse(req.body);
        const recipe = await recipeService.create(
            req.shop!.id,
            data,
            req.auth?.sub,
            req.senderSocketId
        );
        res.status(201).json(recipe);
    }
);

export const updateRecipe = asyncHandler(
    async (req: Request, res: Response) => {
        const { id } = recipeIdParams.parse(req.params);
        const data = updateRecipeSchema.parse(req.body);
        const recipe = await recipeService.update(
            req.shop!.id,
            id,
            data,
            req.auth?.sub,
            req.senderSocketId
        );
        res.json(recipe);
    }
);

export const deleteRecipe = asyncHandler(
    async (req: Request, res: Response) => {
        const { id } = recipeIdParams.parse(req.params);
        await recipeService.remove(
            req.shop!.id,
            id,
            req.auth?.sub,
            req.senderSocketId
        );
        res.status(204).send();
    }
);

export const setRecipeIngredients = asyncHandler(
    async (req: Request, res: Response) => {
        const { id } = recipeIdParams.parse(req.params);
        const { ingredients } = setIngredientsSchema.parse(req.body);
        const recipe = await recipeService.setIngredients(
            req.shop!.id,
            id,
            ingredients,
            req.auth?.sub,
            req.senderSocketId
        );
        res.json(recipe);
    }
);

