'use strict'

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

/**
 * Pedidos Recorrentes — FUT-02
 * Permite que clientes PJ (e PF) agendem recompras automáticas.
 */
class PedidoRecorrente {
  static listByUser(userId, tenantId) {
    return query(
      `SELECT pr.*, cl.nome AS cliente_nome
       FROM pedidos_recorrentes pr
       LEFT JOIN clientes cl ON cl.id = pr.cliente_id
       WHERE pr.user_id = $1 AND pr.tenant_id = $2
       ORDER BY pr.created_at DESC`,
      [userId, tenantId]
    )
  }

  static findById(id, userId) {
    return queryOne(
      `SELECT * FROM pedidos_recorrentes WHERE id = $1 AND user_id = $2`,
      [id, userId]
    )
  }

  static create({ tenant_id, user_id, cliente_id, nome, itens, frequencia, proximo_em }) {
    return queryOne(
      `INSERT INTO pedidos_recorrentes
         (tenant_id,user_id,cliente_id,nome,itens,frequencia,proximo_em)
       VALUES ($1,$2,$3,$4,$5,$6,$7)
       RETURNING *`,
      [tenant_id || 1, user_id, cliente_id || null, nome, JSON.stringify(itens || []), frequencia || 'mensal', proximo_em]
    )
  }

  static update(id, userId, { nome, itens, frequencia, proximo_em, pausado }) {
    return execute(
      `UPDATE pedidos_recorrentes
       SET nome=$1, itens=$2, frequencia=$3, proximo_em=$4, pausado=$5, updated_at=NOW()
       WHERE id=$6 AND user_id=$7`,
      [nome, JSON.stringify(itens || []), frequencia, proximo_em, pausado ?? false, id, userId]
    )
  }

  static togglePausa(id, userId, pausado) {
    return execute(
      `UPDATE pedidos_recorrentes SET pausado=$1, updated_at=NOW() WHERE id=$2 AND user_id=$3`,
      [pausado, id, userId]
    )
  }

  static remove(id, userId) {
    return execute(
      `DELETE FROM pedidos_recorrentes WHERE id=$1 AND user_id=$2`,
      [id, userId]
    )
  }

  /** Retorna todos os recorrentes vencidos hoje (para o job diário) */
  static listDue(tenantId) {
    return query(
      `SELECT pr.*, u.telefone AS user_telefone
       FROM pedidos_recorrentes pr
       LEFT JOIN users u ON u.id = pr.user_id
       WHERE pr.tenant_id = $1
         AND pr.ativo = TRUE
         AND pr.pausado = FALSE
         AND pr.proximo_em <= CURRENT_DATE`,
      [tenantId]
    )
  }

  /** Atualiza proximo_em após execução */
  static avancaProximo(id, frequencia) {
    const intervalMap = {
      semanal:    '7 days',
      quinzenal:  '14 days',
      mensal:     '1 month',
      bimestral:  '2 months',
      trimestral: '3 months',
    }
    const interval = intervalMap[frequencia] || '1 month'
    return execute(
      `UPDATE pedidos_recorrentes
       SET proximo_em = proximo_em + $1::INTERVAL, updated_at = NOW()
       WHERE id = $2`,
      [interval, id]
    )
  }
}

module.exports = PedidoRecorrente
