# frozen_string_literal: true

class HarvestsController < DataController
  after_action :update_crop_medians, only: %i(create update destroy)

  def index
    where = {}
    if params[:member_slug]
      @owner = Member.find_by(slug: params[:member_slug])
      where['owner_id'] = @owner.id
    end

    if params[:crop_slug]
      @crop = Crop.find_by(slug: params[:crop_slug])
      where['crop_id'] = @crop.id
    end

    if params[:planting_slug]
      @planting = Planting.find_by(slug: params[:planting_slug])
      where['planting_id'] = @planting.id
    end

    @harvests = Harvest.search('*', where:,
                                    limit:    100,
                                    page:     params[:page],
                                    load:     false,
                                    boost_by: [:created_at])

    @filename = csv_filename

    respond_with(@harvests)
  end

  def show
    @matching_plantings = matching_plantings if @harvest.owner == current_member
    @photos = @harvest.photos.order(created_at: :desc).paginate(page: params[:page])
    respond_with(@harvest)
  end

  def new
    @harvest = Harvest.new(harvested_at: Time.zone.today)
    @planting = Planting.find_by(slug: params[:planting_slug]) if params[:planting_slug]
    @crop = Crop.find_by(id: params[:crop_id])
    respond_with(@harvest)
  end

  def edit
    @planting = @harvest.planting if @harvest.planting_id
    respond_with(@harvest)
  end

  def create
    @harvest.crop_id = @harvest.planting.crop_id if @harvest.planting_id
    @harvest.harvested_at = Time.zone.now if @harvest.harvested_at.blank?
    @harvest.save
    if params[:return] == 'planting'
      respond_with(@harvest, location: @harvest.planting)
    else
      respond_with(@harvest)
    end
  end

  def update
    @harvest.update(harvest_params)
    respond_with(@harvest)
  end

  def destroy
    @harvest.destroy
    respond_with(@harvest)
  end

  private

  def harvest_params
    params.require(:harvest)
      .permit(:planting_id, :crop_id, :harvested_at, :description,
              :quantity, :unit, :weight_quantity, :weight_unit,
              :plant_part_id, :slug, :si_weight)
      .merge(owner_id: current_member.id)
  end

  def matching_plantings
    Planting.where(crop: @harvest.crop, owner: @harvest.owner)
      .where('(planted_at IS NULL OR planted_at <= ?)', @harvest.harvested_at)
      .where('(finished_at IS NULL OR finished_at >= ?)', @harvest.harvested_at)
  end

  def csv_filename
    specifics = if @owner
                  "#{@owner.to_param}-"
                elsif @crop
                  "#{@crop.to_param}-"
                end
    "Growstuff-#{specifics}Harvests-#{Time.zone.now.to_fs(:number)}.csv"
  end

  def update_crop_medians
    # We only update medians to predict plantings
    # if this harvest is not linked to a planting, then do nothing
    return if @harvest.planting.nil?

    @harvest.planting.update_harvest_days!
    @harvest.crop.update_harvest_medians
  end
end
