import { Request, Response } from "express"
import { z } from "zod"
import { asyncHandler } from "@/core/asyncHandler"
import {
    CreatePaymentProviderAccountSchema,
    CreatePaymentProviderDeviceSchema,
    UpdatePaymentProviderAccountSchema,
    UpdatePaymentProviderDeviceSchema
} from "ttm-shared"
import { paymentProviderAdminService } from "./payment-provider-admin.service"

const ProviderAccountParamsSchema = z.object({
    accountId: z.string().uuid()
})

const ProviderDeviceParamsSchema = z.object({
    deviceId: z.string().uuid()
})

export const getProviderAccounts = asyncHandler(async (req: Request, res: Response) => {
    const rows = await paymentProviderAdminService.listProviderAccounts(req.shop!.ownerId)
    res.json(rows)
})

export const createProviderAccount = asyncHandler(async (req: Request, res: Response) => {
    const input = CreatePaymentProviderAccountSchema.parse(req.body)
    const created = await paymentProviderAdminService.createProviderAccount(req.shop!.ownerId, input)
    res.status(201).json(created)
})

export const updateProviderAccount = asyncHandler(async (req: Request, res: Response) => {
    const { accountId } = ProviderAccountParamsSchema.parse(req.params)
    const input = UpdatePaymentProviderAccountSchema.parse(req.body)
    const updated = await paymentProviderAdminService.updateProviderAccount(req.shop!.ownerId, accountId, input)
    res.json(updated)
})

export const deleteProviderAccount = asyncHandler(async (req: Request, res: Response) => {
    const { accountId } = ProviderAccountParamsSchema.parse(req.params)
    await paymentProviderAdminService.deleteProviderAccount(req.shop!.ownerId, accountId)
    res.status(204).send()
})

export const getProviderDevices = asyncHandler(async (req: Request, res: Response) => {
    const rows = await paymentProviderAdminService.listProviderDevices(req.shop!.ownerId)
    res.json(rows)
})

export const createProviderDevice = asyncHandler(async (req: Request, res: Response) => {
    const input = CreatePaymentProviderDeviceSchema.parse(req.body)
    const created = await paymentProviderAdminService.createProviderDevice(req.shop!.ownerId, input)
    res.status(201).json(created)
})

export const updateProviderDevice = asyncHandler(async (req: Request, res: Response) => {
    const { deviceId } = ProviderDeviceParamsSchema.parse(req.params)
    const input = UpdatePaymentProviderDeviceSchema.parse(req.body)
    const updated = await paymentProviderAdminService.updateProviderDevice(req.shop!.ownerId, deviceId, input)
    res.json(updated)
})

export const deleteProviderDevice = asyncHandler(async (req: Request, res: Response) => {
    const { deviceId } = ProviderDeviceParamsSchema.parse(req.params)
    await paymentProviderAdminService.deleteProviderDevice(req.shop!.ownerId, deviceId)
    res.status(204).send()
})

