# frozen_string_literal: true

class RepositoryStockValuesController < ApplicationController
  include RepositoryDatatableHelper # for use of display_cell_value method on stock update

  before_action :load_vars
  before_action :check_manage_permissions

  def new
    render json: {
      html: render_to_string(
        partial: 'repository_stock_values/manage_modal_content',
        locals: {
          repository_row: @repository_row,
          repository_stock_column: @repository_column,
          unit_items: @repository_column.repository_stock_unit_items,
          repository_stock_value: RepositoryStockValue.new
        }
      )
    }
  end

  def edit
    render json: {
      html: render_to_string(
        partial: 'repository_stock_values/manage_modal_content',
        locals: {
          repository_row: @repository_row,
          repository_stock_column: @repository_column,
          unit_items: @repository_column.repository_stock_unit_items,
          repository_stock_value: @repository_stock_value
        }
      )
    }
  end

  def create_or_update
    ActiveRecord::Base.transaction do
      @repository_stock_value ? update! : create!

      log_activity(
        params[:operator],
        params[:change_amount],
        @repository_stock_value.repository_stock_unit_item.data,
        @repository_stock_value.amount,
        params[:repository_stock_value][:comment]
      )
    end

    render json: {
      stock_managable: true,
      stock_status: @repository_stock_value.status,
      manageStockUrl: edit_repository_stock_repository_repository_row_url(@repository, @repository_row)
    }.merge(display_cell_value(@repository_stock_value.repository_cell, current_team, @repository))
  end

  private

  def update!
    @repository_stock_value.update_data!(repository_stock_value_params, current_user)
  end

  def create!
    repository_cell = @repository_row.repository_cells.create(repository_column: @repository_column)
    @repository_stock_value = RepositoryStockValue.new_with_payload(
      repository_stock_value_params,
      repository_cell: repository_cell,
      created_by: current_user,
      last_modified_by: current_user,
      comment: repository_stock_value_params[:comment].presence
    )
    @repository_stock_value.save!
  end

  def load_vars
    @repository = Repository.find(params[:repository_id])
    @repository_row = @repository.repository_rows.find(params[:id])
    @repository_column = @repository.repository_columns.find_by(data_type: 'RepositoryStockValue')
    @repository_stock_value = @repository_row.repository_stock_value
  end

  def check_manage_permissions
    render_403 unless can_manage_repository_stock?(@repository)
  end

  def repository_stock_value_params
    params.require(:repository_stock_value).permit(:unit_item_id, :amount, :comment, :low_stock_threshold)
  end

  def log_activity(operator, change_amount, unit, new_amount, comment)
    Activities::CreateActivityService
      .call(activity_type: "inventory_item_stock_#{operator}",
            owner: current_user,
            subject: @repository,
            team: @repository.team,
            message_items: {
              repository: @repository.id,
              repository_row: @repository_row.id,
              change_amount: change_amount,
              unit: unit,
              new_amount: new_amount,
              comment: comment
            })
  end
end