import DB from "../config/database/db";
import { ResultSetHeader, RowDataPacket } from "mysql2";
import whatsappPendingMessagesTypes from "../schemas/whatsappPendingMessages.schema";
import { REDIS_CHANNEL, redisSubscriber } from "../config/redis/redis";
import log from "../config/log";

const whatsappPendingMessagesDB: any = {};

whatsappPendingMessagesDB.getById = async ({
  id,
}: whatsappPendingMessagesTypes) => {
  const query =
    "Select * from WhatsappPendingMesssages where id = ?";

  const data = [id];

  const [rows] = await DB.execute<RowDataPacket[]>(
    query,
    data
  );

  if (rows?.length > 0) return rows[0];
  else return false;
};

whatsappPendingMessagesDB.getByClientId = async ({
  clientId,
}: whatsappPendingMessagesTypes) => {
  const query =
    "Select * from WhatsappPendingMesssages where clientId = ? order by id desc";

  const data = [clientId];

  const [rows] = await DB.execute<RowDataPacket[]>(
    query,
    data
  );

  if (rows?.length > 0) return rows;
  else return false;
};

whatsappPendingMessagesDB.getPendingMessages = async () => {
  const query =
    "Select * from WhatsappPendingMesssages where status = 1 order by id asc";

  const [rows] = await DB.execute<RowDataPacket[]>(
    query
  );

  if (rows?.length > 0) return rows;
  else return false;
};

whatsappPendingMessagesDB.add = async ({
  clientId,
  propId,
  userType,
  userId,
  userName,
  userMobile,
  templateType,
  payload,
  file,
  status = 1,
}: whatsappPendingMessagesTypes) => {
  try {
    const query =
      "Insert into WhatsappPendingMesssages (clientId, propId, userType, userId, userName, userMobile, templateType, payload, file, status) values (?,?,?,?,?,?,?,?,?,?)";

    const data = [
      clientId,
      propId,
      userType,
      userId,
      userName,
      userMobile,
      templateType,
      payload,
      file,
      status,
    ];

    const [rows] = await DB.query<ResultSetHeader>(
      query,
      data
    );

    await redisSubscriber.publish(REDIS_CHANNEL, JSON.stringify({
      messageId: rows.insertId,
    }));
    return rows.insertId;
  } catch (error: any) {
    log.info(`Model [WhatsappPending messages], [add], clientId [${clientId}], Error: ${error?.message || error}`);
    return true;
  }
};

whatsappPendingMessagesDB.updateStatus = async ({
  id,
  status,
}: whatsappPendingMessagesTypes) => {
  const query =
    "Update WhatsappPendingMesssages set status = ? where id = ?";

  const data = [status, id];

  const [rows] = await DB.execute<ResultSetHeader>(
    query,
    data
  );

  if (rows.affectedRows > 0) return true;
  else return false;
};

export default whatsappPendingMessagesDB;