# frozen_string_literal: true

require 'ffaker'

FactoryBot.define do
  sequence(:random_string)      { FFaker::Lorem.sentence }
  sequence(:random_description) { FFaker::Lorem.paragraphs(Kernel.rand(1..5)).join("\n") }
  sequence(:random_email)       { FFaker::Internet.email }

  factory :exchange, class: Exchange do
    incoming    { false }
    order_cycle { OrderCycle.first || FactoryBot.create(:simple_order_cycle) }
    sender      { incoming ? FactoryBot.create(:enterprise) : order_cycle.coordinator }
    receiver    { incoming ? order_cycle.coordinator : FactoryBot.create(:enterprise) }
  end

  factory :schedule, class: Schedule do
    sequence(:name) { |n| "Schedule #{n}" }

    transient do
      order_cycles { [OrderCycle.first || create(:simple_order_cycle)] }
    end

    before(:create) do |schedule, evaluator|
      evaluator.order_cycles.each do |order_cycle|
        order_cycle.schedules << schedule
      end
    end
  end

  factory :proxy_order, class: ProxyOrder do
    subscription
    order_cycle { subscription.order_cycles.first }
    before(:create) do |proxy_order, _proxy|
      proxy_order.order&.update_attribute(:order_cycle_id, proxy_order.order_cycle_id)
    end
  end

  factory :variant_override, class: VariantOverride do
    price { 77.77 }
    on_demand { false }
    count_on_hand { 11_111 }
    default_stock { 2000 }
    resettable { false }

    trait :on_demand do
      on_demand { true }
      count_on_hand { nil }
    end

    trait :use_producer_stock_settings do
      on_demand { nil }
      count_on_hand { nil }
    end
  end

  factory :inventory_item, class: InventoryItem do
    enterprise
    variant
    visible { true }
  end

  factory :enterprise_relationship do
    nil
  end

  factory :enterprise_role do
    nil
  end

  factory :enterprise_group, class: EnterpriseGroup do
    name { 'Enterprise group' }
    sequence(:permalink) { |n| "group#{n}" }
    description { 'this is a group' }
    on_front_page { false }
    address { FactoryBot.build(:address) }
  end

  factory :enterprise_fee, class: EnterpriseFee do
    transient { amount { nil } }

    sequence(:name) { |n| "Enterprise fee #{n}" }
    sequence(:fee_type) { |n| EnterpriseFee::FEE_TYPES[n % EnterpriseFee::FEE_TYPES.count] }

    enterprise { Enterprise.first || FactoryBot.create(:supplier_enterprise) }
    calculator { build(:calculator_per_item, preferred_amount: amount) }

    after(:create) { |ef| ef.calculator.save! }

    trait :flat_rate do
      transient { amount { 1 } }
      calculator { build(:calculator_flat_rate, preferred_amount: amount) }
    end

    trait :per_item do
      transient { amount { 1 } }
      calculator { build(:calculator_per_item, preferred_amount: amount) }
    end

    trait :flat_percent_per_item do
      transient { amount { 1 } }
      calculator { build(:calculator_flat_percent_per_item, preferred_flat_percent: amount) }
    end
  end

  factory :adjustment_metadata, class: AdjustmentMetadata do
    adjustment { FactoryBot.create(:adjustment) }
    enterprise { FactoryBot.create(:distributor_enterprise) }
    fee_name { 'fee' }
    fee_type { 'packing' }
    enterprise_role { 'distributor' }
  end

  factory :producer_property, class: ProducerProperty do
    value { 'abc123' }
    producer { create(:supplier_enterprise) }
    property
  end

  factory :stripe_account do
    enterprise { FactoryBot.create(:distributor_enterprise) }
    stripe_user_id { "abc123" }
    stripe_publishable_key { "xyz456" }
  end
end
