class Admin::PreviewPageBuilder

def build

def build
  editing_existing_page? ? build_existing_page : build_new_page
end

def build_existing_page

def build_existing_page
  page = find_page_from_referer.becomes(valid_model_class)
  page.update(@page_params)
  page
end

def build_new_page

def build_new_page
  page = valid_model_class.new(@page_params)
  if creating_child_page?
    parent = find_page_from_referer
    page.parent = parent
    page.layout_id ||= parent.layout_id
  end
  page.save!
  page
end

def creating_child_page?

def creating_child_page?
  @referer =~ %r{/admin/pages/\d+/children/new}
end

def editing_existing_page?

def editing_existing_page?
  @referer =~ %r{/admin/pages/\d+/edit}
end

def extract_page_id_from_referer

def extract_page_id_from_referer
  @referer[%r{/admin/pages/(\d+)}, 1]
end

def find_page_from_referer

def find_page_from_referer
  Page.find(extract_page_id_from_referer)
end

def initialize(model_class:, page_params:, referer:)

def initialize(model_class:, page_params:, referer:)
  @model_class = model_class
  @page_params = page_params
  @referer = referer
end

def valid_model_class

def valid_model_class
  Page.descendants.include?(@model_class) ? @model_class : Page
end