import { RowDataPacket } from "mysql2";
import DB from "../../../config/database/db";

export interface whatsappPendingMessage extends RowDataPacket {
    id: number;
    clientId: number;
    propId: number | null;
    userType: number;
    userId: number;
    userName: string;
    userMobile: string;
    templateType: number;
    payload: string | null;
    status: number;
    createdAt: string;
    updatedAt: string;
}

const PENDING = 1;
const PROCESSING = 2;
const FAILED = 3;

export async function getPendingMessages(): Promise<whatsappPendingMessage[]> {
    const query = "SELECT * FROM WhatsappPendingMesssages WHERE status = ? ORDER BY id ASC";

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

    return rows;
}

export async function claimMessage(id: number): Promise<boolean> {
    const query = "UPDATE WhatsappPendingMesssages SET status = ? WHERE id = ? AND status = ?";

    const [result]: any = await DB.execute(query, [
        PROCESSING,
        id,
        PENDING
    ]);

    return result.affectedRows === 1;
}

export async function  failedMessage(id: number): Promise<void> {
    const query = "UPDATE WhatsappPendingMesssages SET status = ? WHERE id = ? AND status = ?";

    await DB.execute(query, [
        FAILED,
        id,
        PROCESSING
    ]);
}
export async function resetMessage(id: number): Promise<void> {
    const query = "UPDATE WhatsappPendingMesssages SET status = ? WHERE id = ? AND status = ?";

    await DB.execute(query, [
        PENDING,
        id,
        PROCESSING
    ]);
}

export async function moveToSent(
    message: whatsappPendingMessage,
    sentMessage: string
): Promise<void> {

    const connection = await DB.getConnection();

    try {

        await connection.beginTransaction();

        const insertQuery = "INSERT INTO WhatsappSentMesssages (clientId, propId, userType, userId, userName, userMobile, templateId, templateType, provider, projectId, payload, message) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        await connection.execute(insertQuery, [
            message.clientId,
            message.propId,
            message.userType,
            message.userId,
            message.userName,
            message.userMobile,
            message.templateType,
            message.templateType,
            1,
            message.projectId || null,
            message.payload,
            sentMessage
        ]);

        const deleteQuery = "DELETE FROM WhatsappPendingMesssages WHERE id = ? AND status = ?";

        await connection.execute(deleteQuery, [
            message.id,
            PROCESSING
        ]);

        await connection.commit();

    } catch (error) {

        await connection.rollback();

        throw error;

    } finally {

        connection.release();
    }
}