require 'rails_helper'

RSpec.describe 'Admin::Romaneios', type: :request do
  let(:romaneio) { create(:romaneio) }

  describe 'permissão' do
    it 'exige login' do
      get admin_romaneios_path
      expect(response).to redirect_to(new_user_session_path)
    end

    it 'bloqueia operador (não tem admin.romaneio por padrão)' do
      sign_in create(:operador)
      get admin_romaneios_path

      expect(response).to have_http_status(:redirect)
      expect(flash[:alert]).to match(/permissão/i)
    end

    it 'libera gerente' do
      sign_in create(:gerente)
      get admin_romaneios_path

      expect(response).to have_http_status(:ok)
    end
  end

  describe 'GET #pdf' do
    before do
      create(:romaneio_linha, romaneio: romaneio, veiculo: 'GADE_001')
      sign_in create(:admin)
    end

    it 'sai INLINE quando um veículo é pedido — é a prévia do editor' do
      get pdf_admin_romaneio_path(romaneio, veiculo: 'GADE_001')

      expect(response.media_type).to eq('application/pdf')
      expect(response.headers['Content-Disposition']).to match(/inline/)
    end

    it 'sai como download quando nenhum veículo é pedido' do
      get pdf_admin_romaneio_path(romaneio)

      expect(response.headers['Content-Disposition']).to match(/attachment/)
    end
  end

  describe 'PATCH #atualizar_linha' do
    let(:linha) { create(:romaneio_linha, romaneio: romaneio, telefones: '(11) 1111-1111') }

    before { sign_in create(:admin) }

    it 'grava o campo e o marca como editado' do
      patch atualizar_linha_admin_romaneio_path(romaneio),
            params: { linha_id: linha.id, campo: 'telefones', valor: '(11) 99999-0000' },
            as: :json

      expect(response.parsed_body['valor']).to eq('(11) 99999-0000')
      expect(response.parsed_body['editado']).to be(true)
      expect(linha.reload.campos_editados).to include('telefones')
    end

    it 'com valor null restaura o que o plano trouxe e destrava o campo' do
      patch atualizar_linha_admin_romaneio_path(romaneio),
            params: { linha_id: linha.id, campo: 'telefones', valor: '(11) 99999-0000' }, as: :json

      patch atualizar_linha_admin_romaneio_path(romaneio),
            params: { linha_id: linha.id, campo: 'telefones', valor: nil }, as: :json

      expect(linha.reload.telefones).to eq('(11) 1111-1111')
      expect(linha.campos_editados).to be_empty
    end

    it 'recusa campo fora da whitelist — veiculo e ordem são a verdade do roteiro' do
      patch atualizar_linha_admin_romaneio_path(romaneio),
            params: { linha_id: linha.id, campo: 'veiculo', valor: 'GADE_999' }, as: :json

      expect(response).to have_http_status(:unprocessable_entity)
      expect(linha.reload.veiculo).not_to eq('GADE_999')
    end
  end
end
