# frozen_string_literal: true

# = Informations
#
# == License
#
# Ekylibre - Simple agricultural ERP
# Copyright (C) 2008-2009 Brice Texier, Thibaud Merigon
# Copyright (C) 2010-2012 Brice Texier
# Copyright (C) 2012-2014 Brice Texier, David Joulin
# Copyright (C) 2015-2023 Ekylibre SAS
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see http://www.gnu.org/licenses.
#
# == Table: manure_management_plans
#
#  annotation                 :text
#  campaign_id                :integer(4)       not null
#  created_at                 :datetime         not null
#  creator_id                 :integer(4)
#  default_computation_method :string           not null
#  id                         :integer(4)       not null, primary key
#  lock_version               :integer(4)       default(0), not null
#  locked                     :boolean          default(FALSE), not null
#  name                       :string           not null
#  opened_at                  :datetime         not null
#  recommender_id             :integer(4)       not null
#  selected                   :boolean          default(FALSE), not null
#  updated_at                 :datetime         not null
#  updater_id                 :integer(4)
#
class ManureManagementPlan < ApplicationRecord
  include Attachable
  belongs_to :campaign
  belongs_to :recommender, class_name: 'Entity'
  has_many :zones, class_name: 'ManureManagementPlanZone', dependent: :destroy, inverse_of: :plan, foreign_key: :plan_id
  # [VALIDATORS[ Do not edit these lines directly. Use `rake clean:validations`.
  validates :annotation, length: { maximum: 500_000 }, allow_blank: true
  validates :default_computation_method, :name, presence: true, length: { maximum: 500 }
  validates :locked, :selected, inclusion: { in: [true, false] }
  validates :opened_at, presence: true, timeliness: { on_or_after: -> { Time.new(1, 1, 1).in_time_zone }, on_or_before: -> { Time.zone.now + 100.years } }
  validates :campaign, :recommender, presence: true
  # ]VALIDATORS]

  accepts_nested_attributes_for :zones
  selects_among_all :selected, scope: :campaign_id

  scope :selecteds, -> { where(selected: true) }

  protect do
    locked?
  end

  after_save :compute

  def compute
    zones.map(&:compute)
  end

  def build_missing_zones
    active = false
    active = true if zones.empty?
    return false unless campaign

    campaign.activity_productions.includes(:support).order(:activity_id, 'products.name').each do |activity_production|
      # activity_production.active? return all activies except fallow_land
      next unless activity_production.support.is_a?(LandParcel) && activity_production.active?
      next if zones.find_by(activity_production: activity_production)

      zone = zones.build(
        activity_production: activity_production,
        computation_method: default_computation_method,
        administrative_area: activity_production.support.administrative_area,
        cultivation_variety: activity_production.cultivation_variety,
        soil_nature: activity_production.support.soil_nature || activity_production.support.estimated_soil_nature
      )
      zone.estimate_expected_yield
    end
  end

  def mass_density_unit
    :quintal_per_hectare
  end
end
