import { Request, Response } from "express"
import { asyncHandler } from "@/core/asyncHandler"
import { AppError } from "@/core/AppError"
import { pushService } from "./push.service"
import {
    PushHeartbeatSchema,
    PushRegisterSchema,
    PushStatusQuerySchema,
    PushUnregisterSchema,
} from "./push.schema"

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

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

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

function firstString(value: unknown): string | undefined {
    if (typeof value === "string") return value
    if (Array.isArray(value) && typeof value[0] === "string") return value[0]
    return undefined
}

export const registerPushInstallation = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requirePosContext(req)
    const body = PushRegisterSchema.parse(req.body)

    const result = await pushService.registerInstallation({
        ...ctx,
        ...body,
    })

    res.json(result)
})

export const heartbeatPushInstallation = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requirePosContext(req)
    const body = PushHeartbeatSchema.parse(req.body)

    const result = await pushService.heartbeatInstallation({
        ...ctx,
        ...body,
    })

    res.json(result)
})

export const unregisterPushInstallation = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requirePosContext(req)
    const body = PushUnregisterSchema.parse(req.body)

    const result = await pushService.unregisterInstallation({
        ...ctx,
        terminalId: body.terminalId,
    })

    res.json(result)
})

export const getPushInstallationStatus = asyncHandler(async (req: Request, res: Response) => {
    const ctx = requirePosContext(req)
    const query = PushStatusQuerySchema.parse({
        terminalId: firstString(req.query.terminalId),
    })

    const result = await pushService.getInstallationStatus({
        ...ctx,
        terminalId: query.terminalId,
    })

    res.json(result)
})

