require 'rails_helper'

# Trava a CONTABILIZAÇÃO DAS ENTREGAS SEM SUCESSO no painel do MOTORISTA.
#
# O painel do motorista ficou para trás quando o dashboard administrativo passou
# a usar `atendidas` (ver spec/requests/dashboard_spec.rb): continuava em `pagas`
# (só concluídas) e no eixo `planned_date`. O motorista via um valor MENOR do que
# ia receber — e a diferença só aparecia no fechamento, sem explicação.
#
# ⚠️ Sem sucesso TEM checkout: o motorista foi ao local e fechou a visita com
# motivo de insucesso. O deslocamento teve custo, a empresa paga, e o checkout é
# o eixo de data correto também para essas.
RSpec.describe 'Painel do motorista — contabilização das entregas sem sucesso', type: :request do
  include ActiveSupport::Testing::TimeHelpers
  include_context 'espelho de rastreio'

  # O painel abre no MÊS CORRENTE (a estimativa vai até hoje), então congelamos a
  # data: sem isso o spec quebraria sozinho ao rodar no dia 1º, com as datas
  # semeadas caindo fora do mês corrente.
  let(:hoje)  { Date.new(2026, 8, 20) }
  let(:preco) { 10.0 }
  let(:nome)  { 'JOSE DA SILVA' }

  before do
    travel_to(hoje)
    create(:configuracao, chave: 'preco_entrega', valor: preco.to_s)
    sign_in create(:motorista, nome: nome)
  end

  after { travel_back }

  def abrir_painel
    get motorista_dashboard_path
    expect(response).to have_http_status(:ok)
    response.body
  end

  it 'soma a entrega sem sucesso ao valor estimado' do
    semear([
      { driver: nome, vehicle: 'GADE_001', status: 'completed',
        planned_date: Time.zone.local(2026, 8, 5, 8, 0), checkout: Time.zone.local(2026, 8, 5, 10, 0) },
      { driver: nome, vehicle: 'GADE_001', status: 'failed',
        planned_date: Time.zone.local(2026, 8, 6, 8, 0), checkout: Time.zone.local(2026, 8, 6, 11, 0) }
    ])

    corpo = abrir_painel

    # 2 atendidas × R$ 10,00 — com a base antiga (`pagas`) seria 1 e R$ 10,00.
    expect(corpo).to include('2 entregas atendidas')
    expect(corpo).to include('1 entregues · 1 sem sucesso')
    expect(corpo).to include('R$ 20,00')
  end

  it 'conta a sem sucesso pela data do CHECKOUT, não pela planejada' do
    # Planejada em 31/07 (fora do mês), fechada em 01/08 (dentro) → entra.
    semear([
      { driver: nome, vehicle: 'GADE_002', status: 'failed',
        planned_date: Time.zone.local(2026, 7, 31, 8, 0), checkout: Time.zone.local(2026, 8, 1, 9, 0) }
    ])

    corpo = abrir_painel

    expect(corpo).to include('1 entregas atendidas')
    expect(corpo).to include('0 entregues · 1 sem sucesso')
  end

  it 'exclui a sem sucesso planejada no mês mas com checkout fora' do
    # O espelho do caso acima: planejada em 10/08 (dentro), fechada em 01/09
    # (fora) → não entra. Com o eixo antigo (planned_date) entrava.
    semear([
      { driver: nome, vehicle: 'GADE_003', status: 'failed',
        planned_date: Time.zone.local(2026, 8, 10, 8, 0), checkout: Time.zone.local(2026, 9, 1, 9, 0) }
    ])

    corpo = abrir_painel

    expect(corpo).to include('0 entregas atendidas')
    expect(corpo).to include('0 entregues · 0 sem sucesso')
  end

  it 'não conta a entrega pendente, que ainda não tem checkout' do
    semear([
      { driver: nome, vehicle: 'GADE_004', status: 'pending',
        planned_date: Time.zone.local(2026, 8, 7, 8, 0), checkout: nil }
    ])

    corpo = abrir_painel

    expect(corpo).to include('0 entregas atendidas')
    expect(corpo).to include('0 entregues · 0 sem sucesso')
  end

  it 'não mistura a entrega sem sucesso de outro motorista' do
    semear([
      { driver: nome, vehicle: 'GADE_005', status: 'completed',
        planned_date: Time.zone.local(2026, 8, 4, 8, 0), checkout: Time.zone.local(2026, 8, 4, 10, 0) },
      { driver: 'MARIA SOUZA', vehicle: 'GADE_006', status: 'failed',
        planned_date: Time.zone.local(2026, 8, 4, 8, 0), checkout: Time.zone.local(2026, 8, 4, 15, 0) }
    ])

    corpo = abrir_painel

    expect(corpo).to include('1 entregas atendidas')
    expect(corpo).to include('1 entregues · 0 sem sucesso')
    expect(corpo).to include('R$ 10,00')
  end
end
