import { sql } from '../db.js';
import type { Message, MessageDirection, MessageSource } from '@wa-ticketing/shared';
import { auditService } from './auditService.js';

export const messagingService = {
  async appendMessage(
    ticketId: string,
    direction: MessageDirection,
    content: string,
    waMessageId: string | null,
    actorId?: string,
    source: MessageSource = 'whatsapp',
  ): Promise<Message> {
    // Monotonic sequence per ticket
    const [{ next_seq }] = await sql<[{ next_seq: number }]>`
      SELECT COALESCE(MAX(sequence), 0) + 1 AS next_seq
      FROM messages WHERE ticket_id = ${ticketId}
    `;

    const [message] = await sql<[Message]>`
      INSERT INTO messages (ticket_id, direction, content, wa_message_id, sequence, source)
      VALUES (${ticketId}, ${direction}, ${content}, ${waMessageId}, ${next_seq}, ${source})
      RETURNING *
    `;

    if (direction === 'outbound' && actorId) {
      await auditService.log(actorId, 'user', 'message.sent', 'message', message.id, { ticketId });
    }

    return message;
  },

  async getMessages(ticketId: string): Promise<Message[]> {
    return sql<Message[]>`
      SELECT * FROM messages
      WHERE ticket_id = ${ticketId}
      ORDER BY sequence ASC
    `;
  },

  async isDuplicate(waMessageId: string): Promise<boolean> {
    const [row] = await sql<[{ count: string }]>`
      SELECT COUNT(*) AS count FROM messages WHERE wa_message_id = ${waMessageId}
    `;
    return parseInt(row.count) > 0;
  },
};
