# lib/tasks/series_aparelho.rake
#
# Sincroniza o "Número de Série da Base (Aparelho)" da API do SimpliRoute para a
# tabela series_aparelho (ver SincronizarSeriesAparelhoJob).

# Log padrão das tarefas do projeto (ver historico.rake): uma linha de início,
# uma de resultado, e o erro sobe para o cron registrar. É lambda (e não método)
# para não pendurar um `executar` global no Object.
executar = lambda do |&bloco|
  puts "[#{Time.current}] Sincronizando número de série da base (SimpliRoute)..."
  r = bloco.call
  puts "[#{Time.current}] OK — #{r[:datas]} data(s) varrida(s), #{r[:visitas]} visita(s), #{r[:series]} série(s) gravada(s)."
  puts "[#{Time.current}] AVISO — #{r[:falhas].size} data(s) sem resposta da API: #{r[:falhas].map { |f| f[:data] }.join(', ')}" if r[:falhas].present?
rescue StandardError => e
  puts "[#{Time.current}] ERRO: #{e.message}"
  Rails.logger.error("[simpli_route:series] #{e.message}\n#{e.backtrace.first(5).join("\n")}")
  raise
end

namespace :simpli_route do
  desc 'Sincroniza o número de série da base dos últimos 45 dias (cron diário)'
  task series: :environment do
    executar.call { SincronizarSeriesAparelhoJob.perform_now }
  end

  desc 'Backfill de UMA operação inteira — rake "simpli_route:series_operacao[gade_entregas_ubs_sudeste_jul_2026]"'
  task :series_operacao, [:tabela] => :environment do |_t, args|
    tabela = args[:tabela].to_s
    if Operacao.valida?(tabela)
      puts "[#{Time.current}] Backfill da operação #{tabela}..."
      executar.call { SincronizarSeriesAparelhoJob.perform_now(operacao: tabela) }
    else
      puts "[#{Time.current}] ERRO: operação inválida (#{tabela.inspect})."
      puts "Válidas: #{Operacao.nomes_validos.join(', ')}"
    end
  end

  desc 'Backfill por período — rake "simpli_route:series_periodo[2026-07-01,2026-07-31]"'
  task :series_periodo, %i[de ate] => :environment do |_t, args|
    executar.call { SincronizarSeriesAparelhoJob.perform_now(de: Date.parse(args[:de]), ate: Date.parse(args[:ate])) }
  end
end
