class ReviewsController < ApplicationController
  include Pundit

  before_action :authenticate_user!, except: [:show, :list]
  before_action :set_review, only: [:show, :destroy]
  before_action :authorize_action


  def list
    if !params[:learning_object_id].blank?
      reviewable = LearningObject.find params[:learning_object_id]
    elsif !params[:collection_id].blank?
      reviewable = Collection.find params[:collection_id]
    end

    @reviews = Review.where(reviewable: reviewable) unless reviewable.blank?
  end

  # Global variables to show page
  def show
  end

  def new
    @review = Review.new
    @rates = Rating.all

    @reviewable_id = params[:reviewable_id]
    @reviewable_type = params[:reviewable_type]
  end

  def create
    review = Review.where(user: current_user, reviewable_id: params[:reviewable_id], reviewable_type: params[:reviewable_type]).new(review_params)

    respond_to do |format|
      if review.save && !params[:rates].blank? && params[:rates].is_a?(Hash) && params[:rates].size == Rating.count
        ratings = []
        params[:rates].each { |id, value| ratings << ReviewRating.new(review: review, rating_id: id.to_i, value: value.to_i) }
        ReviewRating.import ratings

        format.html { redirect_to params[:reviewable_type].constantize.find(params[:reviewable_id]), notice: t('activerecord.attributes.review.create.notice.successfully_created') }
      else
        review.destroy
        format.html { redirect_to new_review_path, alert: t('activerecord.attributes.review.create.alert.there_was_an_error')}
      end
    end
  end

  def destroy
    redirect = @review.reviewable

    @review.destroy

    respond_to do |format|
      format.html { redirect_to redirect, notice: t('activerecord.attributes.review.destroy.notice.successfully_destroy') }
    end
  end

  # User approve or not, the review
  def rate
    review = Review.find(params[:id])
    user = current_user
    approves = approves_param

    rate = Rate.where(user: user, review: review).first_or_initialize

    rate.update(approves: approves)

    render json: { approves: approves } if request.xhr?
  end

  private

  def set_review
    @review = Review.find params[:id]
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def review_params
    params.require(:review).permit(:name, :description, :pros, :cons)
  end

  def approves_param
    case params[:approves]
    when 'true' then true
    when 'false' then false
    end
  end

  def authorize_action
    @review||= Review.new
    authorize @review
  end

end