class Ingredient < ApplicationRecord
  include TokenizedLike

  belongs_to :user
  has_many :ingredient_units, inverse_of: :ingredient, dependent: :destroy

  accepts_nested_attributes_for :ingredient_units, allow_destroy: true

  validates :name, presence: true
  validates :density, density: true, allow_blank: true

  scope :has_density, -> { where.not(density: nil) }

  def self.search(query)
    tokens = query.to_s.split(' ')

    if tokens.empty?
      Ingredient.none
    else
      Ingredient.matches_tokens(:name, tokens)
    end
  end

  def custom_unit_weight(unit)
    ingredient_units.each do |iu|
      if iu.matches?(unit)
        return UnitConversion::parse(iu.gram_weight, 'grams')
      end
    end

    nil
  end

  def ndbn=(value)
    @usda_food = nil
    super
  end

  def usda_food
    if self.ndbn.present?
      @usda_food ||= UsdaFood.find_by_ndbn(self.ndbn)
    else
      nil
    end
  end

  def usda_food_name
    if usda_food
      usda_food.long_description
    end
  end

  def set_usda_food(food)
    return unless food

    copy_fields = [
        :water,
        :ash,
        :protein,
        :kcal,
        :fiber,
        :sugar,
        :carbohydrates,
        :calcium,
        :iron,
        :magnesium,
        :phosphorus,
        :potassium,
        :sodium,
        :zinc,
        :copper,
        :manganese,
        :vit_c,
        :vit_b6,
        :vit_b12,
        :vit_a,
        :vit_e,
        :vit_d,
        :vit_k,
        :cholesterol
    ]

    copy_fields.each do |f|
      self.send("#{f}=".to_sym, food.send(f.to_sym))
    end

    self.lipids = food.lipid
    self.density = food.density_best_guess
  end

end
