class ArchiveFaqsController < ApplicationController
  before_action :admin_only, except: [:index, :show]
  before_action :set_locale
  before_action :validate_locale, if: :logged_in_as_admin?
  before_action :require_language_id
  before_action :default_locale_only, only: [:new, :create, :manage, :update_positions, :confirm_delete, :destroy]
  around_action :with_locale

  # GET /archive_faqs
  def index
    @archive_faqs = ArchiveFaq.order("position ASC")
    unless logged_in_as_admin?
      @archive_faqs = @archive_faqs.with_translations(I18n.locale)
    end
    respond_to do |format|
      format.html # index.html.erb
    end
  end

  # GET /archive_faqs/1
  def show
    @questions = []
    @archive_faq = ArchiveFaq.find_by!(slug: params[:id])
    if params[:language_id] == "en"
      @questions = @archive_faq.questions
    else
      @archive_faq.questions.each do |question|
        question.translations.each do |translation|
          if translation.is_translated == "1" && params[:language_id].to_s == translation.locale.to_s
            @questions << question
          end
        end
      end
    end
    @page_subtitle = @archive_faq.title + ts(" FAQ")

    respond_to do |format|
      format.html # show.html.erb
    end
  end

  protected

  def build_questions
    notice = ""
    num_to_build = params["num_questions"] ? params["num_questions"].to_i : @archive_faq.questions.count
    if num_to_build < @archive_faq.questions.count
      notice += ts("There are currently %{num} questions. You can only submit a number equal to or greater than %{num}. ", num: @archive_faq.questions.count)
      num_to_build = @archive_faq.questions.count
    elsif params["num_questions"]
      notice += ts("Set up %{num} questions. ", num: num_to_build)
    end
    num_existing = @archive_faq.questions.count
    num_existing.upto(num_to_build-1) do
      @archive_faq.questions.build
    end
    unless notice.blank?
      flash[:notice] = notice
    end
  end

  public

  # GET /archive_faqs/new
  def new
    @archive_faq = authorize ArchiveFaq.new
    1.times { @archive_faq.questions.build(attributes: { question: "This is a temporary question", content: "This is temporary content", anchor: "ThisIsATemporaryAnchor"})}
    respond_to do |format|
      format.html # new.html.erb
    end
  end

  # GET /archive_faqs/1/edit
  def edit
    @archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
    authorize :archive_faq, :full_access? if default_locale?
    build_questions
  end

  # GET /archive_faqs/manage
  def manage
    @archive_faqs = authorize ArchiveFaq.order("position ASC")
  end

  # POST /archive_faqs
  def create
    @archive_faq = authorize ArchiveFaq.new(archive_faq_params)
    if @archive_faq.save
      flash[:notice] = t(".success")
      redirect_to(@archive_faq)
    else
      render action: "new"
    end
  end

  # PUT /archive_faqs/1
  def update
    @archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
    authorize :archive_faq, :full_access? if default_locale?

    if @archive_faq.update(archive_faq_params)
      flash[:notice] = t(".success")
      redirect_to(@archive_faq)
    else
      render action: "edit"
    end
  end

  # reorder FAQs
  def update_positions
    authorize :archive_faq
    if params[:archive_faqs]
      @archive_faqs = ArchiveFaq.reorder_list(params[:archive_faqs])
      flash[:notice] = t(".success")
    elsif params[:archive_faq]
      params[:archive_faq].each_with_index do |id, position|
        ArchiveFaq.update(id, position: position + 1)
        (@archive_faqs ||= []) << ArchiveFaq.find(id)
      end
    end
    respond_to do |format|
      format.html { redirect_to(archive_faqs_path) }
      format.js { render nothing: true }
    end
  end

  # The ?language_id=somelanguage needs to persist throughout URL changes
  # Get the value from set_locale to make sure there's no problem with order
  def default_url_options
    { language_id: set_locale.to_s }
  end

  # Set the locale as an instance variable first
  def set_locale
    session[:language_id] = params[:language_id] if Locale.exists?(iso: params[:language_id])

    if current_user.present?
      @i18n_locale = session[:language_id].presence || current_user.preference.locale.iso
    else
      @i18n_locale = session[:language_id].presence || I18n.default_locale
    end
  end

  def validate_locale
    return if params[:language_id].blank? || Locale.exists?(iso: params[:language_id])

    flash[:error] = "The specified locale does not exist."
    redirect_to url_for(request.query_parameters.merge(language_id: I18n.default_locale))
  end

  def require_language_id
    return if params[:language_id].present? && Locale.exists?(iso: params[:language_id])

    redirect_to url_for(request.query_parameters.merge(language_id: @i18n_locale.to_s))
  end

  def default_locale_only
    return if default_locale?

    flash[:error] = t("archive_faqs.default_locale_only")
    redirect_to archive_faqs_path
  end

  # Setting I18n.locale directly is not thread safe
  def with_locale
    I18n.with_locale(@i18n_locale) { yield }
  end

  # GET /archive_faqs/1/confirm_delete
  def confirm_delete
    @archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
  end

  # DELETE /archive_faqs/1
  def destroy
    @archive_faq = authorize ArchiveFaq.find_by(slug: params[:id])
    @archive_faq.destroy
    redirect_to(archive_faqs_path)
  end

  private

  def default_locale?
    @i18n_locale.to_s == I18n.default_locale.to_s
  end

  def archive_faq_params
    params.require(:archive_faq).permit(
      :title,
      questions_attributes: [
        :id, :question, :anchor, :content, :screencast, :_destroy, :is_translated
      ]
    )
  end
end
