import { Request, Response } from "express"
import { z } from "zod"
import { asyncHandler } from "@/core/asyncHandler"
import { AppError } from "@/core/AppError"
import { pushService } from "./push.service"

const ShopParamsSchema = z.object({
    shopId: z.uuid(),
})

const InstallationParamsSchema = z.object({
    shopId: z.uuid(),
    installationId: z.uuid(),
})

const PushLogsQuerySchema = z.object({
    limit: z.coerce.number().int().positive().max(200).default(50),
})

const SetAdminEnabledSchema = z.object({
    adminEnabled: z.boolean(),
})

function requireAdminShopContext(req: Request) {
    if (!req.auth || req.auth.type !== "admin") {
        throw new AppError("Forbidden", 403)
    }

    if (!req.shop) {
        throw new AppError("Shop context missing", 400)
    }

    return {
        actorUserId: req.auth.sub,
        shopId: req.shop.id,
    }
}

export const listPushInstallationsAdmin = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requireAdminShopContext(req)
    ShopParamsSchema.parse(req.params)

    const installations = await pushService.listAdminInstallations(ctx.shopId)
    res.json({ ok: true, installations })
})

export const listPushLogsAdmin = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requireAdminShopContext(req)
    ShopParamsSchema.parse(req.params)
    const query = PushLogsQuerySchema.parse(req.query)

    const logs = await pushService.listPushLogs(ctx.shopId, query.limit)
    res.json({ ok: true, logs })
})

export const setPushInstallationAdminEnabled = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requireAdminShopContext(req)
    const params = InstallationParamsSchema.parse(req.params)
    const body = SetAdminEnabledSchema.parse(req.body)

    const result = await pushService.setAdminEnabled({
        shopId: ctx.shopId,
        installationId: params.installationId,
        adminEnabled: body.adminEnabled,
        actorUserId: ctx.actorUserId,
    })

    res.json(result)
})

