class Lookbook::Preview

def all

def all
  load_previews if preview_files.size > ViewComponent::Preview.descendants.size
  return @previews if @previews.present?
  previews = ViewComponent::Preview.descendants.map do |p|
    new(p)
  rescue
    Rails.logger.error "[lookbook] error instantiating preview\n#{exception.full_message}"
  end
  if errors.any?
    errors.each do |error|
      Rails.logger.error "[lookbook] preview error\n#{error.full_message}\n"
    end
  end
  sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] }
  @previews ||= PreviewCollection.new(sorted_previews)
end

def clear_cache

def clear_cache
  @previews = nil
end

def collapsible?

def collapsible?
  true
end

def default_example

def default_example
  examples.first
end

def display_params

def display_params
  Lookbook.config.preview_display_params.deep_merge(@preview_inspector&.display_params)
end

def errors

def errors
  @errors ||= []
end

def example(example_name)

def example(example_name)
  examples.find { |m| m.name == example_name.to_s }
end

def examples

def examples
  return @examples if @examples.present?
  public_methods = @preview.public_instance_methods(false)
  public_method_objects = @preview_inspector&.methods&.filter { |m| public_methods.include?(m.name) }
  examples = (public_method_objects || []).map { |m| PreviewExample.new(m.name.to_s, self) }
  sorted = Lookbook.config.sort_examples ? examples.sort_by(&:label) : examples
  @examples = []
  if @preview_inspector&.groups&.any?
    sorted.group_by { |m| m.group }.each do |name, examples|
      if name.nil?
        @examples += examples
      else
        name = label if name.strip == ""
        @examples << PreviewGroup.new(name.underscore, self, examples)
      end
    end
  else
    @examples = sorted
  end
  @examples = @examples.compact
end

def exists?(path)

def exists?(path)
  !!find(path)
end

def find(path)

def find(path)
  all.find { |p| p.lookup_path == path }
end

def full_path

def full_path
  base_path = Array(preview_paths).detect do |preview_path|
    Dir["#{preview_path}/#{name.underscore}.rb"].first
  end
  Pathname.new(Dir["#{base_path}/#{name.underscore}.rb"].first)
end

def hierarchy_depth

def hierarchy_depth
  path.split("/").size
end

def id

def id
  @preview_inspector&.id || generate_id(lookup_path)
end

def initialize(preview)

def initialize(preview)
  @preview = preview
  @preview_inspector = SourceInspector.new(@preview.name)
  super(preview_class_name(preview_class_basename(@preview.name)))
end

def items

def items
  examples.reject { |i| i.hidden? }
end

def label

def label
  @preview_inspector&.label&.presence || lookup_path.split("/").last.titleize
end

def layout

def layout
  @preview.instance_variable_get(:@layout)
end

def load_previews

def load_previews
  @errors = []
  preview_files.each do |file|
    require_dependency file[:path]
  rescue SyntaxError, StandardError => exception
    @errors.push(
      Lookbook::Error.new(exception,
        title: "Preview #{exception.class}",
        file_name: file[:rel_path],
        file_path: file[:path])
    )
  end
end

def parent_collections_names

def parent_collections_names
  File.dirname(path).split("/")
end

def preview_class

def preview_class
  @preview.name
end

def preview_files

def preview_files
  files = Array(Lookbook.config.preview_paths).map do |preview_path|
    Dir["#{preview_path}/**/*preview.rb"].map do |path|
      {
        path: path,
        base_path: preview_path,
        rel_path: Pathname(path).relative_path_from(preview_path).to_s
      }
    end
  end
  files.flatten
end

def preview_paths

def preview_paths
  ViewComponent::Base.preview_paths
end

def type

def type
  :preview
end

def url_path

def url_path
  lookbook_inspect_path lookup_path
end