# frozen_string_literal: true

# Provides methods to check cart's items (available, price, stock, quantity_min)
class Cart::CheckCartService
  def call(order)
    res = { order_id: order.id, details: [] }
    order.order_items.each do |item|
      errors = case item.orderable_type
               when 'Product'
                 check_product(item)
               when /^CartItem::/
                 check_cart_item(item, order)
               else
                 []
               end
      res[:details].push({ item_id: item.id, errors: errors })
    end
    res
  end

  def check_product(item)
    errors = []
    errors.push({ error: 'is_active', value: false }) unless item.orderable.is_active
    if item.quantity > item.orderable.stock['external'] || item.orderable.stock['external'] < item.orderable.quantity_min
      value = item.orderable.stock['external'] < item.orderable.quantity_min ? 0 : item.orderable.stock['external']
      errors.push({ error: 'stock', value: value })
    end
    orderable_amount = item.orderable.amount || 0
    errors.push({ error: 'amount', value: orderable_amount / 100.0 }) if item.amount != orderable_amount
    errors.push({ error: 'quantity_min', value: item.orderable.quantity_min }) if item.quantity < item.orderable.quantity_min
    errors
  end

  def check_cart_item(item, order)
    item.valid?(order.order_items)
    item.errors.to_a
  end
end
