import { Request, Response } from "express";
import { z } from "zod";
import { asyncHandler } from "@/core/asyncHandler";
import { promoCodeService } from "./promoCode.service";
import { CreatePromoCodeSchema, UpdatePromoCodeSchema, ApplyPromoCodeSchema } from "ttm-shared";

const IdParamSchema = z.object({ id: z.string().uuid() });
const UsageIdParamSchema = z.object({ orderId: z.string().uuid(), usageId: z.string().uuid() });
const OrderIdParamSchema = z.object({ orderId: z.string().uuid() });

// ── ADMIN CRUD ──────────────────────────────────────────────────

export const createPromoCode = asyncHandler(async (req: Request, res: Response) => {
    const input = CreatePromoCodeSchema.parse(req.body);
    const result = await promoCodeService.create(req.shop!.id, input);
    res.status(201).json(result);
});

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

export const getPromoCodeById = asyncHandler(async (req: Request, res: Response) => {
    const { id } = IdParamSchema.parse(req.params);
    const code = await promoCodeService.findById(req.shop!.id, id);
    if (!code) return res.status(404).json({ message: "Code promo introuvable" });
    res.json(code);
});

export const updatePromoCode = asyncHandler(async (req: Request, res: Response) => {
    const { id } = IdParamSchema.parse(req.params);
    const input = UpdatePromoCodeSchema.parse(req.body);
    const result = await promoCodeService.update(req.shop!.id, id, input);
    res.json(result);
});

export const deactivatePromoCode = asyncHandler(async (req: Request, res: Response) => {
    const { id } = IdParamSchema.parse(req.params);
    const result = await promoCodeService.deactivate(req.shop!.id, id);
    res.json(result);
});

// ── APPLICATION SUR COMMANDE (POS) ──────────────────────────────

export const applyPromoCode = asyncHandler(async (req: Request, res: Response) => {
    const { orderId } = OrderIdParamSchema.parse(req.params);
    const { code } = ApplyPromoCodeSchema.parse(req.body);
    const result = await promoCodeService.applyToOrder(req.shop!.id, orderId, code);
    res.json(result);
});

export const removePromoCode = asyncHandler(async (req: Request, res: Response) => {
    const { orderId, usageId } = UsageIdParamSchema.parse(req.params);
    const result = await promoCodeService.removeFromOrder(req.shop!.id, orderId, usageId);
    res.json(result);
});

