app/controllers/snapshots_controller.rb
# Mostly RESTful controller for Snapshot model.
class SnapshotsController < ApplicationController
  before_filter :set_snapshot,
                only: %i[show destroy accept reject view_log take_snapshot
                         compare_snapshot]

  def show
    @review_list = @snapshot.sweep.snapshots if @snapshot.sweep
    render
  end

  def create
    url = Url.find(params.delete(:url))

    url.project.viewports.each do |viewport|
      @snapshot          = Snapshot.new
      @snapshot.viewport = viewport
      @snapshot.url      = url
      @snapshot.save!
    end

    redirect_to url,
                notice: t(:model_created,
                          model_name: Snapshot.model_name.human(count: 2),
                          count: 2)
  end

  def destroy
    @snapshot.destroy

    redirect_to @snapshot.url.project,
                notice: t(:model_destroyed,
                          model_name: @snapshot.class.model_name.human)
  end

  def reject
    @snapshot.reject!
    if request.xhr?
      render partial: 'snapshots/header_and_buttons'
    else
      redirect_to @snapshot
    end
  end

  def accept
    @snapshot.accept!
    if request.xhr?
      render partial: 'snapshots/header_and_buttons'
    else
      redirect_to @snapshot
    end
  end

  def view_log
    render
  end

  def take_snapshot
    @snapshot.image                = nil
    @snapshot.accepted_at          = nil
    @snapshot.rejected_at          = nil
    @snapshot.snapshot_diff.try(:destroy!)
    @snapshot.snapshot_diff        = nil
    @snapshot.save!

    @snapshot.take_snapshot

    redirect_to @snapshot, notice: t(:snapshot_retaken)
  end

  def compare_snapshot
    @snapshot.accepted_at          = nil
    @snapshot.rejected_at          = nil
    @snapshot.snapshot_diff.try(:destroy!)
    @snapshot.snapshot_diff        = nil
    @snapshot.save! # triggers the comparison via after_commit hook

    redirect_to @snapshot, notice: t(:snapshot_recompared)
  end

  private

  def set_snapshot
    @snapshot = Snapshot.find(params[:id])
  end
end
