import { env } from "@/lib/env";
import { logError } from "@/lib/logger";
import type { MemberOpenLog } from "@karma/viewpoint-sdk/types";
import amqp from "amqplib";

export class ViewPointQueue {
  private queue_name = env.GetString("VIEWPOINT_QUEUE_NAME");

  async publishMemberOpenLog(
    accountID: string,
    logData: Pick<MemberOpenLog, "comment" | "subject" | "type">,
  ) {
    try {
      const connection = await amqp.connect(
        env.GetString("PRODUCER_QUEUE_CONNECTION"),
      );
      const payload = {
        accountID,
        ...logData,
      };
      const channel = await connection?.createChannel();
      await channel?.assertQueue(this.queue_name, { durable: true });
      channel?.sendToQueue(
        this.queue_name,
        Buffer.from(
          JSON.stringify({
            ops: "MEMBER",
            process: "OPEN_LOG",
            payload,
          }),
        ),
        {
          persistent: true,
        },
      );

      setTimeout(() => {
        void connection.close();
      }, 500);
    } catch (err) {
      logError(err as string);
    }
  }

  async pushMemberCompleteHoldBooking(payload: unknown) {
    try {
      const connection = await amqp.connect(
        env.GetString("PRODUCER_QUEUE_CONNECTION"),
      );
      const channel = await connection?.createChannel();
      await channel?.assertQueue(this.queue_name, { durable: true });
      channel?.sendToQueue(
        this.queue_name,
        Buffer.from(
          JSON.stringify({
            ops: "MEMBER",
            process: "COMPLETE_HOLD_BOOKING",
            payload,
          }),
        ),
        {
          persistent: true,
        },
      );

      setTimeout(() => {
        void connection.close();
      }, 500);
    } catch (err) {
      logError(err as string);
    }
  }

  async pushMemberDocumentUpload(payload: unknown) {
    try {
      const connection = await amqp.connect(
        env.GetString("PRODUCER_QUEUE_CONNECTION"),
      );
      const channel = await connection?.createChannel();
      await channel?.assertQueue(this.queue_name, { durable: true });
      channel?.sendToQueue(
        this.queue_name,
        Buffer.from(
          JSON.stringify({
            ops: "MEMBER",
            process: "DOCUMENT_UPLOAD",
            payload,
          }),
        ),
        {
          persistent: true,
        },
      );

      setTimeout(() => {
        void connection.close();
      }, 500);
    } catch (err) {
      logError(err as string);
    }
  }
}
