import { Request, Response } from "express"
import { CreateDepositDefinitionSchema, UpdateDepositDefinitionSchema } from "ttm-shared"
import { z } from "zod"
import { asyncHandler } from "@/core/asyncHandler"
import { depositDefinitionService } from "./depositDefinition.service"

const depositDefinitionParamsSchema = z.object({
    id: z.string().uuid(),
})

const depositDefinitionQuerySchema = z.object({
    activeOnly: z.coerce.boolean().optional().default(true),
})

export const getDepositDefinitions = asyncHandler(async (req: Request, res: Response) => {
    const { activeOnly } = depositDefinitionQuerySchema.parse(req.query)

    const definitions = await depositDefinitionService.listByShop(req.shop!.id, {
        activeOnly,
    })

    res.json(definitions)
})

export const createDepositDefinition = asyncHandler(async (req: Request, res: Response) => {
    const input = CreateDepositDefinitionSchema.parse(req.body)

    const created = await depositDefinitionService.create(
        req.shop!.id,
        input,
        req.auth?.sub,
        req.senderSocketId,
    )

    res.status(201).json(created)
})

export const updateDepositDefinition = asyncHandler(async (req: Request, res: Response) => {
    const { id } = depositDefinitionParamsSchema.parse(req.params)
    const input = UpdateDepositDefinitionSchema.parse(req.body)

    const updated = await depositDefinitionService.update(
        req.shop!.id,
        id,
        input,
        req.auth?.sub,
        req.senderSocketId,
    )

    res.json(updated)
})

export const deleteDepositDefinition = asyncHandler(async (req: Request, res: Response) => {
    const { id } = depositDefinitionParamsSchema.parse(req.params)

    const updated = await depositDefinitionService.softDelete(
        req.shop!.id,
        id,
        req.auth?.sub,
        req.senderSocketId,
    )

    res.json(updated)
})

