require 'rails_helper'

# Modo de visualização "Por motorista" (/consolidacoes?visao=motoristas) e o
# painel do motorista: quem entra, o que a tela soma e o drill-down que responde
# "de onde vem esse valor".
RSpec.describe 'Visão por motorista', type: :request do
  def consolidacao_finalizada(motorista:, valor:, nome: 'Fechamento Junho')
    c = create(:consolidacao, nome: nome, status: :finalizada,
               data_inicio: Date.new(2026, 6, 1), data_fim: Date.new(2026, 6, 30))
    create(:consolidacao_entrega, consolidacao: c, motorista_nome: motorista, valor_aplicado: valor)
    create(:consolidacao_motorista, consolidacao: c, motorista_nome: motorista)
    c
  end

  let(:periodo) { { inicio: '2026-06-01', fim: '2026-06-30' } }

  describe 'admin — /consolidacoes?visao=motoristas' do
    it 'bloqueia motorista (Pundit)' do
      sign_in create(:motorista)
      get consolidacoes_path(visao: 'motoristas')
      expect(response).to redirect_to(root_path)
    end

    it 'soma o total do motorista no período' do
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
      sign_in create(:gerente)

      get consolidacoes_path(periodo.merge(visao: 'motoristas'))

      expect(response).to have_http_status(:ok)
      expect(response.body).to include('Carlos')
      expect(response.body).to include('R$ 120,00')
    end

    # O default tem que ser o MESMO recorte do dashboard ("Consolidado / Pago"),
    # senão o operador compara as duas telas e vê valores diferentes.
    it 'sem status na URL mostra o CONSOLIDADO (rascunho fica de fora)' do
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
      rascunho = create(:consolidacao, status: :rascunho,
                        data_inicio: Date.new(2026, 6, 1), data_fim: Date.new(2026, 6, 30))
      create(:consolidacao_entrega, consolidacao: rascunho, motorista_nome: 'Carlos', valor_aplicado: 500.0)
      create(:consolidacao_motorista, consolidacao: rascunho, motorista_nome: 'Carlos')
      sign_in create(:gerente)

      get consolidacoes_path(periodo.merge(visao: 'motoristas'))
      expect(response.body).to include('R$ 120,00')
      expect(response.body).not_to include('R$ 620,00')

      get consolidacoes_path(periodo.merge(visao: 'motoristas', status: 'todos'))
      expect(response.body).to include('R$ 620,00')
    end

    it 'só abre a composição do motorista clicado' do
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
      consolidacao_finalizada(motorista: 'Pedro',  valor: 90.0,  nome: 'Fechamento do Pedro')
      sign_in create(:gerente)

      get consolidacoes_path(periodo.merge(visao: 'motoristas'))
      expect(response.body).not_to include('O que forma esse valor')

      get consolidacoes_path(periodo.merge(visao: 'motoristas', detalhe: 'Carlos'))
      expect(response.body).to include('O que forma esse valor')
      expect(response.body).to include('Fechamento Junho')
      expect(response.body).not_to include('Fechamento do Pedro')
    end

    it 'a visão lista continua sendo o padrão' do
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
      sign_in create(:gerente)

      get consolidacoes_path

      expect(response.body).to include('Fechamento Junho')
      expect(response.body).not_to include('Total do período')
    end

    it 'gera o PDF do período' do
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
      sign_in create(:gerente)

      get totais_pdf_consolidacoes_path(periodo)

      expect(response).to have_http_status(:ok)
      expect(response.media_type).to eq('application/pdf')
    end
  end

  describe 'motorista — painel' do
    it 'mostra o total fechado do período e os fechamentos que o compõem' do
      motorista = create(:motorista, nome: 'Carlos')
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0, nome: 'Fechamento Junho')
      consolidacao_finalizada(motorista: 'Pedro',  valor: 999.0, nome: 'Fechamento do Pedro')
      sign_in motorista

      get motorista_dashboard_path(periodo)

      expect(response).to have_http_status(:ok)
      expect(response.body).to include('Fechamento Junho')
      expect(response.body).to include('R$ 120,00')
      expect(response.body).not_to include('Fechamento do Pedro')
    end

    it 'gera o PDF do período' do
      motorista = create(:motorista, nome: 'Carlos')
      consolidacao_finalizada(motorista: 'Carlos', valor: 120.0)
      sign_in motorista

      get motorista_totais_pdf_path(periodo)

      expect(response).to have_http_status(:ok)
      expect(response.media_type).to eq('application/pdf')
    end

    it 'não é acessível por quem não é motorista' do
      sign_in create(:gerente)
      get motorista_totais_pdf_path(periodo)
      expect(response).to redirect_to(dashboard_path)
    end
  end
end
