# frozen_string_literal: true

module Decidim
  module Consultations
    module Admin
      class QuestionsController < Decidim::Consultations::Admin::ApplicationController
        include QuestionAdmin

        def index
          authorize! :index, Decidim::Consultations::Question
          @questions = collection
          render layout: "decidim/admin/consultation"
        end

        def new
          authorize! :new, Decidim::Consultations::Question
          @form = question_form.instance
          render layout: "decidim/admin/consultation"
        end

        def create
          authorize! :create, Decidim::Consultations::Question
          @form = question_form.from_params(params, current_consultation: current_consultation)

          CreateQuestion.call(@form) do
            on(:ok) do
              flash[:notice] = I18n.t("questions.create.success", scope: "decidim.admin")
              redirect_to consultation_questions_path
            end

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

        def edit
          authorize! :edit, current_question
          @form = question_form.from_model(current_question, current_consultation: current_consultation)
          render layout: "decidim/admin/question"
        end

        def update
          authorize! :update, current_question

          @form = question_form
                  .from_params(params, question_id: current_question.id, current_consultation: current_consultation)

          UpdateQuestion.call(current_question, @form) do
            on(:ok) do |question|
              flash[:notice] = I18n.t("questions.update.success", scope: "decidim.admin")
              redirect_to edit_question_path(question)
            end

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

        def destroy
          authorize! :destroy, current_question
          current_question.destroy!

          flash[:notice] = I18n.t("questions.destroy.success", scope: "decidim.admin")

          redirect_to consultation_questions_path(current_consultation)
        end

        private

        def collection
          @collection ||= current_consultation&.questions
        end

        def ability_context
          super.merge(current_consultation: current_consultation)
        end

        def question_form
          form(QuestionForm)
        end
      end
    end
  end
end