require 'rails_helper'

RSpec.describe User, type: :model do
  describe 'validações de nome' do
    it 'exige nome com ao menos 3 caracteres' do
      user = build(:operador, nome: 'ab')
      expect(user).not_to be_valid
      expect(user.errors[:nome]).to be_present
    end
  end

  describe 'e-mail e senha por papel' do
    it 'exige e-mail para não-motoristas' do
      expect(build(:operador).email_required?).to be true
      expect(build(:operador, email: nil)).not_to be_valid
    end

    it 'NÃO exige e-mail nem senha para motoristas (login por PIN)' do
      motorista = build(:motorista, email: nil, password: nil)
      expect(motorista.email_required?).to be false
      expect(motorista.password_required?).to be false
      expect(motorista).to be_valid
    end
  end

  describe 'validação de PIN (somente motoristas)' do
    it 'aceita PIN de 4 dígitos numéricos' do
      expect(build(:motorista, pin_code: '0420')).to be_valid
    end

    it 'rejeita PIN com tamanho diferente de 4' do
      expect(build(:motorista, pin_code: '123')).not_to be_valid
    end

    it 'rejeita PIN não numérico' do
      expect(build(:motorista, pin_code: '12ab')).not_to be_valid
    end

    it 'ignora a validação de PIN para não-motoristas' do
      expect(build(:operador, pin_code: 'xyz')).to be_valid
    end
  end

  describe 'PIN único entre motoristas' do
    it 'impede dois motoristas com o mesmo PIN' do
      create(:motorista, pin_code: '4242')
      duplicado = build(:motorista, pin_code: '4242')
      expect(duplicado).not_to be_valid
      expect(duplicado.errors[:pin_code]).to be_present
    end
  end

  describe '#regenerar_login_token!' do
    it 'gera e persiste um token novo' do
      motorista = create(:motorista)
      expect { motorista.regenerar_login_token! }
        .to change { motorista.reload.login_token }.from(nil)
    end
  end
end
