import { tracked } from "@/core/tracked"
import type { PaymentTerminalRealtimeStatus, PaymentTerminalStatusChangedDto } from "ttm-shared"

type EmitPaymentTerminalStatusInput = {
    shopId: string
    deviceId: string | null
    paymentAttemptId?: string | null
    orderId?: string | null
    stationId?: string | null
    senderSocketId?: string | null
    reason?: string | null
}

function buildPaymentTerminalStatusPayload(
    status: PaymentTerminalRealtimeStatus,
    input: EmitPaymentTerminalStatusInput,
): PaymentTerminalStatusChangedDto | null {
    if (!input.deviceId) return null

    return {
        deviceId: input.deviceId,
        status,
        paymentAttemptId: input.paymentAttemptId ?? null,
        orderId: input.orderId ?? null,
        stationId: input.stationId ?? null,
        reason: input.reason ?? null,
    }
}

async function emitPaymentTerminalStatusChanged(
    status: PaymentTerminalRealtimeStatus,
    input: EmitPaymentTerminalStatusInput,
) {
    const payload = buildPaymentTerminalStatusPayload(status, input)
    if (!payload) return null

    const tracker = tracked({
        shopId: input.shopId,
        entity: "PaymentTerminal",
        senderSocketId: input.senderSocketId ?? null,
    })

    await tracker.emit(
        "payment.terminal_status_changed",
        payload,
        payload.deviceId,
        1,
    )

    return payload
}

export const paymentTerminalRealtimeService = {
    async markBusy(input: EmitPaymentTerminalStatusInput) {
        return emitPaymentTerminalStatusChanged("busy", {
            ...input,
            reason: input.reason ?? "Transaction en cours sur ce terminal",
        })
    },

    async requestRefresh(input: EmitPaymentTerminalStatusInput) {
        return emitPaymentTerminalStatusChanged("refresh_required", {
            ...input,
            reason: input.reason ?? "Terminal libéré, vérification immédiate demandée",
        })
    },
}

