class Admin::AssetsController

def asset_params

def asset_params
  params.permit(:id, :upload, :for_attachment, asset: [:for_attachment, { asset: [] }])
end

def compress(uploaded_asset)

def compress(uploaded_asset)
  require 'open-uri'
  data = $kraken.upload(uploaded_asset.tempfile.path, 'lossy' => true)
  new_asset = data.success ? data.kraked_url : uploaded_asset.tempfile.path
  File.write(uploaded_asset.tempfile, URI.open(new_asset).read, mode: 'wb')
  uploaded_asset
end

def compression_enabled?

def compression_enabled?
  current_site.try(:compress).nil? ? true : current_site.compress
end

def create

def create
  @assets = []
  @page_attachments = []
  uploads = Array(asset_params.dig('asset', 'asset')).reject(&:blank?)
  uploads.each do |uploaded_asset|
    result = process_uploaded_asset(uploaded_asset)
    if result[:asset]
      @asset = result[:asset]
      if params[:for_attachment]
        @page = Page.find_by_id(params[:page_id]) || Page.new
        @page_attachments << (@page_attachment = @asset.page_attachments.build(page: @page))
      end
      @assets << @asset
    else
      flash[result.fetch(:flash_type, :error)] = result[:error]
      @errors = result[:error]
    end
  end
  if asset_params[:for_attachment]
    render partial: 'admin/page_attachments/attachment', collection: @page_attachments
  elsif @errors.present?
    flash[:error] = @errors
    redirect_to new_admin_asset_path
  else
    response_for :create
  end
end

def failure_response(message, status, flash_type)

def failure_response(message, status, flash_type)
  { error: message, status: status, flash_type: flash_type }
end

def index

def index
  assets = Asset.order('created_at DESC')
  @page = Page.find(params[:page_id]) if params[:page_id]
  @term = assets.ransack(params[:search] || '')
  assets = @term.result(distinct: true)
  @types = params[:filter] ? params[:filter].split(',') : []
  if @types.include?('all')
    params[:filter] = nil
  elsif @types.any?
    assets = assets.of_types(@types)
  end
  @assets = paginated? ? assets.paginate(pagination_parameters) : assets.all
  respond_to do |format|
    format.js do
      @page = Page.find_by_id(params[:page_id])
      render partial: 'asset_table', locals: { with_pagination: true }
    end
    format.html do
      render
    end
  end
end

def maybe_compress(uploaded_asset)

def maybe_compress(uploaded_asset)
  should_compress?(uploaded_asset.content_type) ? compress(uploaded_asset) : uploaded_asset
end

def process_uploaded_asset(uploaded_asset)

def process_uploaded_asset(uploaded_asset)
  return failure_response('No file uploaded.', :unprocessable_entity, :error) unless uploaded_asset.present?
  if uploaded_asset.content_type == 'application/octet-stream'
    return failure_response('Please only upload assets that have a valid extension in the name.', :unprocessable_entity, :notice)
  end
  unless Asset.approved_content_types.include?(uploaded_asset.content_type)
    return failure_response('Unsupported file type.', :unsupported_media_type, :error)
  end
  processed_upload = maybe_compress(uploaded_asset)
  asset = Asset.create(asset: processed_upload, caption: '')
  if asset.valid?
    set_owner_or_editor(asset)
    { asset: asset }
  else
    failure_response(asset.errors.full_messages.first, :unprocessable_entity, :error)
  end
end

def set_owner_or_editor(asset = @asset)

def set_owner_or_editor(asset = @asset)
  return unless asset
  asset.created_by_id = current_user.id
  asset.updated_by_id = current_user.id
  asset.save! if asset.id.present?
end

def should_compress?(content_type)

def should_compress?(content_type)
  $kraken.api_key.present? && COMPRESS_FILE_TYPE.include?(content_type) && compression_enabled?
end

def uploader

def uploader
  @page_attachments = []
  result = process_uploaded_asset(asset_params[:upload])
  if result[:asset]
    @asset = result[:asset]
    if params[:for_attachment]
      @page = Page.find_by_id(params[:page_id]) || Page.new
      @page_attachments << (@page_attachment = @asset.page_attachments.build(page: @page))
    end
    render json: { url: @asset.public_url }
  else
    flash[result.fetch(:flash_type, :error)] = result[:error]
    render json: { error: result[:error] }, status: result.fetch(:status, :unprocessable_entity)
  end
end