'use strict'

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

const produtoController = {
  async list(req, res) {
    try {
      const tenantId = req.tenant.id
      const { search, categoria, ativo, limit, offset } = req.query
      const rows = await Produto.list(tenantId, {
        search,
        categoria,
        ativo: ativo === undefined ? true : ativo === 'true',
        limit,
        offset,
      })
      res.json(rows)
    } catch (err) {
      console.error('[produto.list]', err.message)
      res.status(500).json({ error: 'Erro ao listar produtos' })
    }
  },

  async listAll(req, res) {
    try {
      const tenantId = req.tenant.id
      const { search, categoria, limit, offset } = req.query
      const rows = await Produto.list(tenantId, { search, categoria, limit, offset })
      res.json(rows)
    } catch (err) {
      res.status(500).json({ error: 'Erro ao listar produtos' })
    }
  },

  async listCategorias(req, res) {
    try {
      const rows = await Produto.listCategorias(req.tenant.id)
      res.json(rows.map(r => r.categoria))
    } catch (err) {
      res.status(500).json({ error: 'Erro ao listar categorias' })
    }
  },

  async get(req, res) {
    try {
      const prod = await Produto.findById(req.params.id)
      if (!prod) return res.status(404).json({ error: 'Produto não encontrado' })
      res.json(prod)
    } catch (err) {
      res.status(500).json({ error: 'Erro ao buscar produto' })
    }
  },

  async create(req, res) {
    try {
      const tenantId = req.tenant.id
      const { sku, nome, descricao, unidade, preco, preco_promocional, estoque, categoria } = req.body
      if (!nome?.trim()) return res.status(400).json({ error: 'nome é obrigatório' })
      if (preco === undefined || preco === null) return res.status(400).json({ error: 'preco é obrigatório' })

      if (sku) {
        const existe = await Produto.findBySku(sku, tenantId)
        if (existe) return res.status(409).json({ error: 'SKU já cadastrado' })
      }

      const prod = await Produto.create({ tenant_id: tenantId, sku, nome: nome.trim(), descricao, unidade, preco, preco_promocional: preco_promocional || null, estoque, categoria })
      res.status(201).json(prod)
    } catch (err) {
      console.error('[produto.create]', err.message)
      res.status(500).json({ error: 'Erro ao criar produto' })
    }
  },

  async update(req, res) {
    try {
      const prod = await Produto.findById(req.params.id)
      if (!prod) return res.status(404).json({ error: 'Produto não encontrado' })
      await Produto.update(req.params.id, req.body)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao atualizar produto' })
    }
  },

  async updateEstoque(req, res) {
    try {
      const { estoque } = req.body
      if (estoque === undefined) return res.status(400).json({ error: 'estoque é obrigatório' })
      await Produto.updateEstoque(req.params.id, estoque)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao atualizar estoque' })
    }
  },

  async updatePreco(req, res) {
    try {
      const { preco } = req.body
      if (preco === undefined) return res.status(400).json({ error: 'preco é obrigatório' })
      await Produto.updatePreco(req.params.id, preco)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao atualizar preço' })
    }
  },

  async remove(req, res) {
    try {
      await Produto.delete(req.params.id)
      res.json({ ok: true })
    } catch (err) {
      res.status(500).json({ error: 'Erro ao remover produto' })
    }
  },

  // Importação CSV — recebe array de produtos no body
  async importar(req, res) {
    try {
      const tenantId = req.tenant.id
      const { produtos } = req.body
      if (!Array.isArray(produtos) || produtos.length === 0) {
        return res.status(400).json({ error: 'produtos deve ser um array não vazio' })
      }
      const resultados = { inseridos: 0, atualizados: 0, erros: [] }
      for (const p of produtos) {
        if (!p.nome || !p.sku) {
          resultados.erros.push({ sku: p.sku || '?', erro: 'nome e sku são obrigatórios' })
          continue
        }
        try {
          const res2 = await Produto.upsertBySku({ tenant_id: tenantId, ...p })
          // ON CONFLICT atualiza → xmax > 0 indica UPDATE
          if (res2 && res2.xmax && res2.xmax !== '0') resultados.atualizados++
          else resultados.inseridos++
        } catch (e) {
          resultados.erros.push({ sku: p.sku, erro: e.message })
        }
      }
      res.json(resultados)
    } catch (err) {
      console.error('[produto.importar]', err.message)
      res.status(500).json({ error: 'Erro na importação' })
    }
  },
}

module.exports = produtoController
