class RequisicaoDeRelatorio < ApplicationRecord
  belongs_to :usuario

  validates_presence_of :usuario_id, :url, :status

  enum status: { pendente: 0, em_processamento: 1, concluido: 2, cancelado: 98, falhou: 99 }

  after_create :executar_relatorio_em_segundo_plano

  def executar_relatorio_em_segundo_plano
    # Verifica se existe algum relatório em processamento para o mesmo usuário
    if RequisicaoDeRelatorio.exists?(usuario_id: self.usuario_id, status: :em_processamento)
      return
    end

    # Caso contrário, inicie o processamento normalmente
    iniciar_geracao_de_relatorio
  end

  def iniciar_geracao_de_relatorio
    Thread.new do
      begin
        sleep(8)
        iniciado_em = Time.now
        self.update_columns(status: :em_processamento)

        response = HTTParty.get(url + "&processar=true&contexto_id=#{self.contexto_id}&contexto_tipo=#{self.contexto_tipo}&token=#{self.token}", timeout: 1500)
        finalizado_em = Time.now

        if response.code == 200
          self.update_columns(
            status: :concluido,
            pdf: response.body,
            token: nil,
            gerado_em: diferenca_de_tempo_em_palavras(iniciado_em, finalizado_em)
          )
        else
          self.update_columns(
            status: :falhou,
            token: nil,
            gerado_em: diferenca_de_tempo_em_palavras(iniciado_em, finalizado_em)
          )
        end
      rescue Exception => e
        finalizado_em = Time.now
        self.update_columns(
          status: :falhou,
          token: nil,
          gerado_em: diferenca_de_tempo_em_palavras(iniciado_em, finalizado_em),
          motivo_da_falha: e.message
        )
      ensure
        # Após a conclusão (com sucesso ou falha), iniciar o próximo relatório pendente
        iniciar_proximo_relatorio_pendente
      end
    end
  end

  def iniciar_proximo_relatorio_pendente
    proximo_relatorio = RequisicaoDeRelatorio.where(usuario_id: self.usuario_id, status: :pendente).order("id desc").first
    proximo_relatorio&.iniciar_geracao_de_relatorio if proximo_relatorio
  end

  def status_tag
    if self.pendente?
      '<span class="label label-default">PENDENTE</span>'
    elsif self.em_processamento?
      '<img src="icon-girador.gif" /> PROCESSANDO...'
    elsif self.concluido?
      '<span class="label label-success">CONCLUÍDO</span>'
    elsif self.cancelado?
      '<span class="label label-warning">CANCELADO</span>'
    elsif self.falhou?
      '<span class="label label-danger">FALHOU</span>'
    end
  end
end
