class Asset

def self.define_class_method(name, &block)

called from AssetType to set type_condition? methods on Asset
def self.define_class_method(name, &block)
  eigenclass.send :define_method, name, &block
end

def self.eigenclass

returns the return value of class << self block, which is self (as defined within that block)
def self.eigenclass
  class << self
    self;
  end
end

def self.thumbnail_names

def self.thumbnail_names
  thumbnail_sizes.keys
end

def self.thumbnail_options

this is a convenience for image-pickers
def self.thumbnail_options
  asset_sizes = thumbnail_sizes.map do |k, v|
    size_id = k
    size_description = "#{k}: "
    size_description << (v.is_a?(Array) ? v.join(' as ') : v)
    [size_description, size_id]
  end.sort_by { |pair| pair.last.to_s }
  asset_sizes.unshift ['Original (as uploaded)', 'original']
  asset_sizes
end

def self.thumbnail_sizes

for backwards compatibility
def self.thumbnail_sizes
  AssetType.find(:image).paperclip_styles
end

def aspect(style_name = 'original')

def aspect(style_name = 'original')
  geometry(style_name).aspect
end

def asset_type

def asset_type
  AssetType.for(asset)
end

def asset_variant(style_name)

def asset_variant(style_name)
  case style_name
  when 'thumbnail'
    asset.variant(gravity: 'Center', resize: '100x100^', crop: '100x100+0+0')
  when 'small'
    asset.variant(gravity: 'Center', resize: '320x320^')
  when 'normal'
    asset.variant(gravity: 'Center', resize_to_limit: [asset.metadata[:width], asset.metadata[:height]])
  when 'icon'
    asset.variant(gravity: 'Center', resize: '50x50^')
  end
end

def assign_title

def assign_title
  self.title = asset.filename.base
end

def assign_uuid

def assign_uuid
  self.uuid = UUIDTools::UUID.timestamp_create.to_s unless uuid?
end

def attached_to?(page)

def attached_to?(page)
  pages.include?(page)
end

def basename

def basename
  File.basename(asset_file_name, '.*') if asset_file_name
end

def count_with_asset_types(asset_types, *args)

def count_with_asset_types(asset_types, *args)
  with_asset_types(asset_types) { where(*args).count }
end

def dimensions_known?

def dimensions_known?
  original_width? && original_height?
end

def extension(style_name = 'original')

def extension(style_name = 'original')
  if style_name == 'original'
    original_extension
  elsif style = paperclip_styles[style_name.to_sym]
    style.format
  else
    original_extension
  end
end

def find_all_by_asset_types(asset_types, *args)

def find_all_by_asset_types(asset_types, *args)
  with_asset_types(asset_types) { where *args }
end

def geometry(style_name = 'original')

def geometry(style_name = 'original')
  unless style?(style_name)
    raise Paperclip::StyleError,
          "Requested style #{style_name} is not defined for this asset."
  end
  @geometry ||= {}
  begin
    @geometry[style_name] ||= if style_name.to_s == 'original'
                                original_geometry
                              else
                                style = asset.styles[style_name.to_sym]
                                original_geometry.transformed_by(style.geometry)
                                # this can return dimensions for fully specified style sizes but not for relative sizes when there are no original dimensions
                              end
  rescue Paperclip::TransformationError => e
    Rails.logger.warn "geometry transformation error: #{e}"
    original_geometry # returns a blank geometry if the real geometry cannot be calculated
  end
end

def height(style_name = 'original')

def height(style_name = 'original')
  geometry(style_name).height.to_i
end

def horizontal?(style_name = 'original')

def horizontal?(style_name = 'original')
  geometry(style_name).horizontal?
end

def known_types

def known_types
  AssetType.known_types
end

def orientation(style_name = 'original')

def orientation(style_name = 'original')
  a = aspect(style_name)
  if a == nil?
    'unknown'
  elsif a < 1.0
    'vertical'
  elsif a > 1.0
    'horizontal'
  else
    'square'
  end
end

def original_extension

def original_extension
  return asset_file_name.split('.').last.downcase if asset_file_name
end

def original_geometry

def original_geometry
  @original_geometry ||= Paperclip::Geometry.new(original_width, original_height)
end

def read_dimensions

def read_dimensions
  if image? && file = asset.queued_for_write[:original]
    geometry = Paperclip::Geometry.from_file(file)
    self.original_width = geometry.width
    self.original_height = geometry.height
    self.original_extension = File.extname(file.path)
  end
  true
end

def render_original(style_name)

def render_original(style_name)
  style_name.to_s == 'original' && asset.key.include?('culturaldistrict')
end

def square?(style_name = 'original')

def square?(style_name = 'original')
  geometry(style_name).square?
end

def style?(style_name = 'original')

def style?(style_name = 'original')
  style_name == 'original' || paperclip_styles.keys.include?(style_name.to_sym)
end

def thumbnail(style_name = 'original')

def thumbnail(style_name = 'original')
  return asset.url if style_name.to_s == 'original' || render_original(style_name)
  return asset_variant(style_name.to_s).processed.url if asset.variable?
  asset_type.icon(style_name.to_s)
end

def vertical?(style_name = 'original')

def vertical?(style_name = 'original')
  geometry(style_name).vertical?
end

def width(style_name = 'original')

def width(style_name = 'original')
  geometry(style_name).width.to_i
end

def with_asset_types(asset_types, &block)

def with_asset_types(asset_types, &block)
  w_asset_types = AssetType.conditions_for(asset_types)
  with_scope(where(conditions: ["#{w_asset_types} = ?", block]))
end