class Lookbook::AppController

def assign_inspector

def assign_inspector
  @inspector = {
    panes: {
      source: {
        label: "Source",
        template: "code",
        hotkey: "s",
        items: @source,
        clipboard: @source.map { |s| @source.many? ? "#{s[:label]}\n#{s[:content]}" : s[:content] }.join("\n\n")
      },
      output: {
        label: "Output",
        template: "code",
        hotkey: "o",
        items: @output,
        clipboard: @output.map { |o| @output.many? ? "#{o[:label]}\n#{o[:content]}" : o[:content] }.join("\n\n")
      },
      notes: {
        label: "Notes",
        template: "notes",
        hotkey: "n",
        items: @notes,
        disabled: @notes.none?
      }
    }
  }
end

def assign_nav

def assign_nav
  @nav = Collection.new
  previews.reject { |p| p.hidden? }.each do |preview|
    current = @nav
    if preview.hierarchy_depth == 1
      current.add(preview)
    else
      preview.lookbook_parent_collections.each.with_index(1) do |name, i|
        target = current.get_or_create(name)
        if preview.hierarchy_depth == i + 1
          target.add(preview)
        else
          current = target
        end
      end
    end
  end
  @nav
end

def current_layout

def current_layout
  preview_controller.send :_layout, preview_controller.lookup_context, [:html]
end

def find_example

def find_example
  @example = if @preview
    if params[:path] == @preview.lookbook_path
      redirect_to show_path "#{params[:path]}/#{@preview.lookbook_examples.first.name}"
    else
      @example_name = File.basename(params[:path])
      @preview.lookbook_example(@example_name)
    end
  end
end

def find_preview

def find_preview
  candidates = []
  params[:path].to_s.scan(%r{/|$}) { candidates << $` }
  match = candidates.reverse.detect { |candidate| Lookbook::Preview.exists?(candidate) }
  @preview = match ? Lookbook::Preview.find(match) : nil
end

def include_example_data(example)

def include_example_data(example)
  content = HtmlBeautifier.beautify(preview_controller.render_example_to_string(@preview, example.name))
  @output << {
    label: "<!-- #{example.label} -->",
    content: content,
    lang: Lookbook::Lang.find(:html)
  }
  render_args = @preview.render_args(example.name, params: preview_controller.params.permit!)
  has_template = render_args[:template] != "view_components/preview"
  @source << {
    label: has_template ? "<!-- #{example.label} -->" : "\# #{example.label}",
    content: has_template ? example.template_source(render_args[:template]) : example.method_source,
    lang: has_template ? example.template_lang(render_args[:template]) : example.source_lang
  }
  if example.notes.present?
    @notes << {
      label: example.label,
      content: example.notes
    }
  end
end

def initialize_inspector

def initialize_inspector
  @source = []
  @output = []
  @notes = []
end

def preview

def preview
  if @example
    render html: rendered_example
  else
    render "app/not_found"
  end
end

def preview_controller

def preview_controller
  return @preview_controller if @preview_controller.present?
  controller_class = Lookbook.config.preview_controller.constantize
  controller_class.class_eval { include Lookbook::PreviewController }
  controller = controller_class.new
  controller.request = request
  controller.response = response
  @preview_controller ||= controller
end

def previews

def previews
  Lookbook::Preview.all.sort_by(&:label)
end

def rendered_example

def rendered_example
  if @example.type == :group
    examples = @example.examples.map do |example|
      {
        label: example.label,
        html: preview_controller.render_example_to_string(@preview, example.name)
      }
    end
    set_params
    joined = render_to_string "lookbook/preview_group", locals: {examples: examples}, layout: nil
    preview_controller.render_in_layout_to_string(joined, @preview.lookbook_layout || current_layout)
  else
    set_params(@example)
    preview_controller.params[:path] = "#{@preview.preview_name}/#{@example.name}".chomp("/")
    preview_controller.process(:previews)
  end
end

def set_params(example = nil)

def set_params(example = nil)
  example_params = @preview.lookbook_display_params.deep_merge(example ? example.lookbook_display_params : {})
  preview_controller.params.merge!({
    lookbook: {
      display: Lookbook.config.preview_display_params.deep_merge(example_params)
    }
  })
end

def show

def show
  if @example
    begin
      @rendered_example = rendered_example.gsub("\"", "&quot;")
      (@example.type == :group ? @example.examples : [@example]).each do |example|
        include_example_data(example)
      end
      assign_inspector
    rescue *EXCEPTIONS
      render "app/error"
    end
  else
    render "app/not_found"
  end
end