# frozen_string_literal: true

class Admin::FormTemplatesController < Admin::StaffController
  before_action :ensure_form_templates_enabled

  def index
    form_templates = FormTemplate.all.order(:id)
    render_serialized(form_templates, AdminFormTemplateSerializer, root: "form_templates")
  end

  def new
  end

  def preview
    params.require(:name)
    params.require(:template)

    if params[:id].present?
      template = FormTemplate.find(params[:id])
      template.assign_attributes(name: params[:name], template: params[:template])
    else
      template = FormTemplate.new(name: params[:name], template: params[:template])
    end

    begin
      template.validate!
      render json: success_json
    rescue FormTemplate::NotAllowed => err
      render_json_error(err.message)
    end
  end

  def create
    params.require(:name)
    params.require(:template)

    begin
      template = FormTemplate.create!(name: params[:name], template: params[:template])
      render_serialized(template, AdminFormTemplateSerializer, root: "form_template")
    rescue FormTemplate::NotAllowed => err
      render_json_error(err.message)
    end
  end

  def show
    template = FormTemplate.find(params[:id])
    render_serialized(template, AdminFormTemplateSerializer, root: "form_template")
  end

  def edit
    FormTemplate.find(params[:id])
  end

  def update
    template = FormTemplate.find(params[:id])

    begin
      template.update!(name: params[:name], template: params[:template])
      render_serialized(template, AdminFormTemplateSerializer, root: "form_template")
    rescue FormTemplate::NotAllowed => err
      render_json_error(err.message)
    end
  end

  def destroy
    template = FormTemplate.find(params[:id])
    template.destroy!

    render json: success_json
  end

  private

  def ensure_form_templates_enabled
    raise Discourse::InvalidAccess.new unless SiteSetting.experimental_form_templates
  end
end