'use strict'

const { execute, queryOne, query } = require('../database/postgres')

class MensagemInterna {
  // Lista mensagens de um pedido (ou de um setor, sem pedido)
  static listByPedido(pedidoId) {
    return query(
      `SELECT * FROM mensagens_internas WHERE pedido_id = $1 ORDER BY created_at ASC`,
      [pedidoId]
    )
  }

  // Lista mensagens de um setor (inbox do setor) — apenas não lidas, ou todas
  static listBySetor(tenantId, setor, somenteNaoLidas = false) {
    const cond = somenteNaoLidas ? 'AND lida = FALSE' : ''
    return query(
      `SELECT mi.*, p.id AS pid, p.status AS pedido_status, p.total AS pedido_total
       FROM mensagens_internas mi
       LEFT JOIN pedidos p ON p.id = mi.pedido_id
       WHERE mi.tenant_id = $1 AND mi.setor = $2 ${cond}
       ORDER BY mi.created_at DESC
       LIMIT 100`,
      [tenantId, setor]
    )
  }

  // Contagem de não lidas por setor
  static contadorNaoLidas(tenantId) {
    return query(
      `SELECT setor, COUNT(*) AS total
       FROM mensagens_internas
       WHERE tenant_id = $1 AND lida = FALSE
       GROUP BY setor
       ORDER BY setor`,
      [tenantId]
    )
  }

  // Total de não lidas (para badge geral)
  static totalNaoLidas(tenantId) {
    return queryOne(
      `SELECT COUNT(*) AS total FROM mensagens_internas WHERE tenant_id = $1 AND lida = FALSE`,
      [tenantId]
    )
  }

  // Envia mensagem
  static create({ tenantId, pedidoId, setor, remetente, mensagem }) {
    return execute(
      `INSERT INTO mensagens_internas (tenant_id, pedido_id, setor, remetente, mensagem)
       VALUES ($1, $2, $3, $4, $5) RETURNING id`,
      [tenantId, pedidoId || null, setor || 'geral', remetente, mensagem]
    )
  }

  // Marcar como lida (uma ou todas de um pedido)
  static marcarLida(id) {
    return execute(`UPDATE mensagens_internas SET lida = TRUE WHERE id = $1`, [id])
  }

  static marcarTodasLidasPorPedido(pedidoId) {
    return execute(`UPDATE mensagens_internas SET lida = TRUE WHERE pedido_id = $1`, [pedidoId])
  }

  static marcarTodasLidasPorSetor(tenantId, setor) {
    return execute(
      `UPDATE mensagens_internas SET lida = TRUE WHERE tenant_id = $1 AND setor = $2 AND lida = FALSE`,
      [tenantId, setor]
    )
  }
}

module.exports = MensagemInterna
