'use strict'

const MensagemInterna = require('../models/MensagemInterna')

const SETORES_VALIDOS = ['geral','atendimento','cotacao','separacao','embalagem','auditoria','fiscal','expedicao','financeiro','suporte']

const inboxController = {
  // INB-01 — Lista mensagens de um setor
  async listBySetor(req, res) {
    try {
      const { setor } = req.params
      if (!SETORES_VALIDOS.includes(setor)) return res.status(400).json({ error: 'Setor inválido' })
      const somenteNaoLidas = req.query.nao_lidas === 'true'
      const rows = await MensagemInterna.listBySetor(req.tenant.id, setor, somenteNaoLidas)
      res.json(rows)
    } catch (err) {
      res.status(500).json({ error: 'Erro ao listar inbox' })
    }
  },

  // INB-02 — Lista mensagens de um pedido
  async listByPedido(req, res) {
    try {
      const rows = await MensagemInterna.listByPedido(req.params.pedidoId)
      res.json(rows)
    } catch (err) {
      res.status(500).json({ error: 'Erro ao listar mensagens do pedido' })
    }
  },

  // INB-02 — Envia mensagem interna (setor + pedido opcional)
  async enviar(req, res) {
    try {
      const { pedido_id, setor, mensagem } = req.body
      if (!setor || !mensagem) return res.status(400).json({ error: 'setor e mensagem são obrigatórios' })
      if (!SETORES_VALIDOS.includes(setor)) return res.status(400).json({ error: 'Setor inválido' })

      const remetente = req.user?.nome || req.user?.email || 'Sistema'
      const result = await MensagemInterna.create({
        tenantId:  req.tenant.id,
        pedidoId:  pedido_id || null,
        setor,
        remetente,
        mensagem,
      })
      res.status(201).json({ ok: true, id: result.id })
    } catch (err) {
      console.error('[inbox.enviar]', err.message)
      res.status(500).json({ error: 'Erro ao enviar mensagem' })
    }
  },

  // INB-03 — Badge: contagem de não lidas por setor
  async contadores(req, res) {
    try {
      const rows = await MensagemInterna.contadorNaoLidas(req.tenant.id)
      const total = await MensagemInterna.totalNaoLidas(req.tenant.id)
      res.json({ total: Number(total?.total ?? 0), por_setor: rows })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao buscar contadores' })
    }
  },

  // Marcar lida
  async marcarLida(req, res) {
    try {
      await MensagemInterna.marcarLida(req.params.id)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao marcar lida' })
    }
  },

  // Marcar todas lidas de um pedido
  async marcarTodasPedido(req, res) {
    try {
      await MensagemInterna.marcarTodasLidasPorPedido(req.params.pedidoId)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao marcar lidas' })
    }
  },

  // Marcar todas lidas de um setor
  async marcarTodasSetor(req, res) {
    try {
      const { setor } = req.params
      await MensagemInterna.marcarTodasLidasPorSetor(req.tenant.id, setor)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao marcar lidas' })
    }
  },
}

module.exports = inboxController
