require_relative '../spec_helper'

feature 'receiving an order', js: true do
  let(:admin) { create :user, groups: [create(:workgroup, role_orders: true)] }
  let(:supplier) { create :supplier }
  let(:article) { create :article, supplier: supplier, unit_quantity: 3 }
  let(:order) { create :order, supplier: supplier, article_ids: [article.id] } # need to ref article
  let(:go1) { create :group_order, order: order }
  let(:go2) { create :group_order, order: order }
  let(:oa) { order.order_articles.find_by_article_id(article.id) }
  let(:goa1) { create :group_order_article, group_order: go1, order_article: oa }
  let(:goa2) { create :group_order_article, group_order: go2, order_article: oa }

  # set quantities of group_order_articles
  def set_quantities(q1, q2)
    goa1.update_quantities(*q1)
    goa2.update_quantities(*q2)
    oa.update_results!
    order.finish!(admin)
    reload_articles
  end

  # reload all group_order_articles
  def reload_articles
    goa1.reload unless goa1.destroyed?
    goa2.reload unless goa2.destroyed?
    oa.reload
  end

  def check_quantities(units, q1, q2)
    reload_articles
    expect(oa.units).to eq units
    expect(goa1.destroyed? ? 0 : goa1.result).to be_within(1e-3).of q1
    expect(goa2.destroyed? ? 0 : goa2.result).to be_within(1e-3).of q2
  end

  before { login admin }

  it 'has product ordered visible' do
    set_quantities [3, 0], [0, 0]
    visit receive_order_path(id: order.id)
    expect(page).to have_content(article.name)
    expect(page).to have_selector("#order_article_#{oa.id}")
  end

  it 'has product not ordered invisible' do
    set_quantities [0, 0], [0, 0]
    visit receive_order_path(id: order.id)
    expect(page).to_not have_selector("#order_article_#{oa.id}")
  end

  it 'is not received by default' do
    set_quantities [3, 0], [0, 0]
    visit receive_order_path(id: order.id)
    expect(find("#order_articles_#{oa.id}_units_received").value).to be_blank
  end

  it 'does not change anything when received is ordered' do
    set_quantities [2, 0], [3, 2]
    visit receive_order_path(id: order.id)
    fill_in "order_articles_#{oa.id}_units_received", :with => oa.units_to_order
    find('input[type="submit"]').click
    expect(page).to have_selector('body')
    check_quantities 2, 2, 4
  end

  it 'redistributes properly when received is more' do
    set_quantities [2, 0], [3, 2]
    visit receive_order_path(id: order.id)
    fill_in "order_articles_#{oa.id}_units_received", :with => 3
    find('input[type="submit"]').click
    expect(page).to have_selector('body')
    check_quantities 3, 2, 5
  end

  it 'redistributes properly when received is less' do
    set_quantities [2, 0], [3, 2]
    visit receive_order_path(id: order.id)
    fill_in "order_articles_#{oa.id}_units_received", :with => 1
    find('input[type="submit"]').click
    expect(page).to have_selector('body')
    check_quantities 1, 2, 1
  end

  it 'has a locked field when edited elsewhere' do
    set_quantities [2, 0], [3, 2]
    goa1.result = goa1.result + 1
    goa1.save!
    visit receive_order_path(id: order.id)
    expect(find("#order_articles_#{oa.id}_units_received")).to be_disabled
  end

  it 'leaves locked rows alone when submitted' do
    set_quantities [2, 0], [3, 2]
    goa1.result = goa1.result + 1
    goa1.save!
    visit receive_order_path(id: order.id)
    find('input[type="submit"]').click
    expect(page).to have_selector('body')
    check_quantities 2, 3, 4
  end
end
