module Lookbook::LocatableEntity

def base_directory

def base_directory
  return @_base_directory if @_base_directory
  directories = Array(base_directories).map(&:to_s).sort_by { |path| path.split("/").size }.reverse
  @_base_directory ||= directories.find { |dir| file_path.to_s.start_with?(dir) }
end

def directory_path

def directory_path
  @_directory_path ||= Pathname(file_pathname.dirname)
end

def file_extension

def file_extension
  @_file_extension ||= file_pathname.extname
end

def file_name(strip_ext = false)

def file_name(strip_ext = false)
  basename = file_pathname.basename
  (strip_ext ? basename.to_s.split(".").first : basename).to_s
end

def file_name_base

def file_name_base
  @_file_name_slug ||= file_name(true).gsub(/(_component_preview|component_preview|preview)$/, "")
end

def file_pathname

def file_pathname
  Pathname(file_path)
end

def last_modified

def last_modified
  @_last_modified ||= File.mtime(file_path)
end

def logical_path

def logical_path
  return @_logical_path if @_logical_path
  directory = fetch_config(:logical_path) { relative_directory_path.to_s }
  @_logical_path ||= PathUtils.to_path(directory, file_name_base)
end

def relative_directory_path

def relative_directory_path
  @_relative_directory_path ||= directory_path.relative_path_from(base_directory)
end

def relative_file_path

def relative_file_path
  @_relative_file_path ||= file_pathname.relative_path_from(base_directory)
end