class Admin::PagesController

def assign_page_attributes

def assign_page_attributes
  if params[:page_id].blank?
    model.slug = '/'
  end
  model.parent_id = params[:page_id]
end

def count_deleted_pages

def count_deleted_pages
  @count = model.children.count + 1
end

def edit

def edit
  verify_site_id
  load_assets
  @page_url = generate_page_url(request.url, @page)
  @page_path = format_path(@page.path)
  @versions = format_versions(@page.versions)
  response_for :edit
end

def fetch_search_results

def fetch_search_results
  @query = params.dig(:search, :query)
  Page.ransack(title_cont: @query, site_id_eq: @site_id).result
    .or(Page.ransack(slug_cont: @query, site_id_eq: @site_id).result)
end

def format_versions(versions)

def format_versions(versions)
  return nil unless versions.any?
  versions
    .sort_by(&:created_at).reverse
    .map do |version|
    {
      index: version&.index,
      update_date: version&.created_at&.strftime('%B %d, %Y'),
      update_time: version&.created_at&.strftime('%I:%M %p'),
      updated_by: User.unscoped.find_by(id: version&.whodunnit)&.name || 'Unknown User',
    }
  end
end

def generate_view_page_url

def generate_view_page_url
  @view_page_url = generate_page_url(request.url, @page)
end

def index

def index
  set_site_and_homepage
  @q = initialize_search
  response_for :plural
end

def initialize_meta_rows_and_buttons

def initialize_meta_rows_and_buttons
  @buttons_partials ||= []
  @meta ||= []
  @meta << { field: 'slug', type: 'text_field', args: [{ class: 'textbox' }] }
  @meta << { field: 'breadcrumb', type: 'text_field', args: [{ class: 'textbox' }] }
end

def initialize_search

def initialize_search
  Page.ransack(params[:search] || '')
end

def load_assets

def load_assets
  assets = Asset.order(created_at: :desc)
  @term = assets.ransack(params[:search].presence || {})
  @term.result(distinct: true)
end

def model_class

def model_class
  if Page.descendants.any? { |d| d.to_s == params[:page_class] }
    verify_page_class(params[:page_class])
  elsif params[:page_id]
    Page.find(params[:page_id]).children
  else
    Page
  end
end

def new

def new
  assets = Asset.order('created_at DESC')
  @term = assets.ransack(params[:search] || '')
  @page = self.model = model_class.new_with_defaults(trusty_config)
  assign_page_attributes
  response_for :new
end

def process_with_exception(page)

def process_with_exception(page)
  page.process(request, response)
  @performed_render = true
  render template: 'site/show_page', layout: false
  raise PreviewStop
end

def restore

def restore
  index = params[:version_index].to_i
  restore_page_version(@page, index)
  redirect_to edit_admin_page_path(@page)
end

def restore_page_version(page, index)

def restore_page_version(page, index)
  lock_version = page.lock_version
  restored_page = page.versions[index].reify(has_many: true)
  restored_page.lock_version = lock_version
  restored_page.save!
end

def save_table_position

def save_table_position
  new_position = params[:new_position]
  Page.save_order(new_position)
  head :ok
end

def search

def search
  @site_id = params[:site_id] || Page.current_site.id
  @q = initialize_search
  @pages = fetch_search_results if search_query_present?
  render
end

def search_query_present?

def search_query_present?
  params.dig(:search, :query).present?
end

def set_page

def set_page
  @page = Page.find(params[:id])
end

def set_site_and_homepage

def set_site_and_homepage
  @site ||= Page.current_site
  @homepage = @site&.homepage || Page.homepage
  @site_id = @site&.id
end

def validation_error(e)

def validation_error(e)
  flash[:error] = e.message
  render :new
end

def verify_page_class(page_class)

def verify_page_class(page_class)
  if page_class.constantize.ancestors.include?(Page)
    page_class.constantize
  else
    raise "I'm not allowed to constantize #{page_class}!"
  end
end

def verify_site_id

def verify_site_id
  page_site_id = @page.site_id
  user_site_ids = current_user.admins_sites.each.pluck(:site_id)
  unless user_site_ids.include?(page_site_id)
    redirect_to admin_pages_url
  end
end