# frozen_string_literal: true

module Api
  module V2
    class StepsController < ::Api::V1::StepsController
      def index
        steps = timestamps_filter(@protocol.steps).page(params.dig(:page, :number))
                                                  .per(params.dig(:page, :size))

        render jsonapi: steps, each_serializer: Api::V2::StepSerializer,
               include: include_params,
               rte_rendering: render_rte?,
               team: @team
      end

      def show
        render jsonapi: @step, serializer: Api::V2::StepSerializer,
               include: include_params,
               rte_rendering: render_rte?,
               team: @team
      end

      def create
        raise PermissionError.new(Protocol, :create) unless can_manage_protocol_in_module?(@protocol)

        @protocol.transaction do
          @step = @protocol.steps.create!(
            step_params.merge!(completed: false,
                               user: current_user,
                               position: @protocol.number_of_steps,
                               last_modified_by_id: current_user.id)
          )
        end
        render jsonapi: @step, serializer: Api::V2::StepSerializer, status: :created
      end

      def update
        @step.assign_attributes(
          step_params.merge!(last_modified_by_id: current_user.id)
        )

        if @step.changed? && @step.save!
          if @step.saved_change_to_attribute?(:completed)
            completed_steps = @protocol.steps.where(completed: true).count
            all_steps = @protocol.steps.count
            type_of = @step.saved_change_to_attribute(:completed).last ? :complete_step : :uncomplete_step
            log_activity(type_of, my_module: @task.id,
                                  num_completed: completed_steps.to_s,
                                  num_all: all_steps.to_s)
          end
          render jsonapi: @step, serializer: Api::V2::StepSerializer, status: :ok
        else
          render body: nil, status: :no_content
        end
      end

      private

      def step_params
        raise TypeError unless params.require(:data).require(:type) == 'steps'

        params.require(:data).require(:attributes).permit(:name, :completed)
      end

      def permitted_includes
        %w(tables assets checklists checklists.checklist_items comments user form_responses)
      end
    end
  end
end
