# frozen_string_literal: true

module Decidim
  module ParticipatoryProcesses
    module Admin
      # Controller used to manage participatory process types for the current
      # organization
      class ParticipatoryProcessTypesController < Decidim::ParticipatoryProcesses::Admin::ApplicationController
        helper_method :collection, :current_participatory_process_type
        layout "decidim/admin/participatory_process_type"

        # GET /admin/participatory_process_types
        def index
          enforce_permission_to :index, :participatory_process_type
        end

        # GET /admin/participatory_process_types/new
        def new
          enforce_permission_to :create, :participatory_process_type
          @form = participatory_process_type_form.instance
        end

        # POST /admin/participatory_process_types
        def create
          enforce_permission_to :create, :participatory_process_type
          @form = participatory_process_type_form.from_params(params)

          CreateParticipatoryProcessType.call(@form) do
            on(:ok) do |_process_type|
              flash[:notice] = I18n.t("participatory_process_types.create.success", scope: "decidim.admin")
              redirect_to participatory_process_types_path
            end

            on(:invalid) do
              flash.now[:alert] = I18n.t("participatory_process_types.create.error", scope: "decidim.admin")
              render :new
            end
          end
        end

        # GET /admin/participatory_process_types/:id/edit
        def edit
          enforce_permission_to :edit, :participatory_process_type, participatory_process_type: current_participatory_process_type
          @form = participatory_process_type_form.from_model(
            current_participatory_process_type,
            participatory_process_type: current_participatory_process_type
          )
        end

        # PUT /admin/participatory_process_types/:id
        def update
          enforce_permission_to :update, :participatory_process_type, participatory_process_type: current_participatory_process_type

          @form = participatory_process_type_form
                  .from_params(params, participatory_process_type: current_participatory_process_type)

          UpdateParticipatoryProcessType.call(current_participatory_process_type, @form) do
            on(:ok) do
              flash[:notice] = I18n.t("participatory_process_types.update.success", scope: "decidim.admin")
              redirect_to participatory_process_types_path
            end

            on(:invalid) do
              flash.now[:alert] = I18n.t("participatory_process_types.update.error", scope: "decidim.admin")
              render :edit
            end
          end
        end

        # DELETE /admin/participatory_process_types/:id
        def destroy
          enforce_permission_to :destroy, :participatory_process_type, participatory_process_type: current_participatory_process_type

          DestroyParticipatoryProcessType.call(current_participatory_process_type, current_user) do
            on(:ok) do
              flash[:notice] = I18n.t("participatory_process_types.destroy.success", scope: "decidim.admin")
              redirect_to participatory_process_types_path
            end
          end
        end

        private

        def participatory_process_type_form
          form(Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessTypeForm)
        end

        def current_participatory_process_type
          @current_participatory_process_type ||= collection.find(params[:id])
        end

        def collection
          @collection ||= Decidim::ParticipatoryProcessType.where(organization: current_organization)
        end
      end
    end
  end
end