class Ajax::ModerationController < ApplicationController
  rescue_from(ActionController::ParameterMissing) do |param_miss_ex|
    @status = :parameter_error
    @message = I18n.t('messages.parameter_error', parameter: param_miss_ex.param.capitalize)
    @success = false
    render partial: "ajax/shared/status"
  end

  def vote
    params.require :id
    params.require :upvote

    report = Report.find(params[:id])

    begin
      current_user.report_vote(report, params[:upvote])
    rescue
      @status = :fail
      @message = I18n.t('messages.moderation.vote.fail')
      @success = false
      return
    end

    @count = report.votes
    @status = :okay
    @message = I18n.t('messages.moderation.vote.okay')
    @success = true
  end

  def destroy_vote
    params.require :id

    report = Report.find(params[:id])

    begin
      current_user.report_unvote report
    rescue
      @status = :fail
      @message = I18n.t('messages.moderation.destroy_vote.fail')
      @success = false
      return
    end

    @count = report.votes
    @status = :okay
    @message = I18n.t('messages.moderation.destroy_vote.okay')
    @success = true
  end

  def destroy_report
    params.require :id

    report = Report.find(params[:id])

    begin
      report.deleted = true
      report.save
    rescue
      @status = :fail
      @message = I18n.t('messages.moderation.destroy_report.fail')
      @success = false
      return
    end

    @status = :okay
    @message = I18n.t('messages.moderation.destroy_report.okay')
    @success = true
  end

  def create_comment
    params.require :id
    params.require :comment

    report = Report.find(params[:id])

    @success = false

    begin
      current_user.report_comment(report, params[:comment])
    rescue ActiveRecord::RecordInvalid
      @status = :rec_inv
      @message = I18n.t('messages.moderation.create_comment.rec_inv')
      return
    end

    @status = :okay
    @message = I18n.t('messages.moderation.create_comment.okay')
    @success = true
    @render = render_to_string(partial: 'moderation/discussion', locals: { report: report })
    @count = report.moderation_comments.all.count
  end

  def destroy_comment
    params.require :comment

    @status = :err
    @success = false
    comment = ModerationComment.find(params[:comment])

    unless current_user == comment.user
      @status = :nopriv
      @message = I18n.t('messages.moderation.destroy_comment.nopriv')
      @success = false
      return
    end

    comment.destroy

    @status = :okay
    @message = I18n.t('messages.moderation.destroy_comment.okay')
    @success = true
  end

  def ban
    @status = :err
    @message = I18n.t('messages.moderation.ban.error')
    @success = false

    params.require :user
    params.require :ban
    params.require :permaban

    reason = params[:reason]
    target = User.find_by_screen_name(params[:user])
    unban  = params[:ban] == "0"
    perma  = params[:permaban] == "1"

    buntil = DateTime.strptime params[:until], "%m/%d/%Y %I:%M %p" unless unban || perma

    if !unban && target.has_role?(:administrator)
      @status = :nopriv
      @message = I18n.t('messages.moderation.ban.nopriv')
      @success = false
      return
    end

    if unban
      target.unban
      @message = I18n.t('messages.moderation.ban.unban')
      @success = true
    elsif perma
      target.ban nil, reason
      @message = I18n.t('messages.moderation.ban.perma')
    else
      target.ban buntil, reason
      @message = I18n.t('messages.moderation.ban.temp', date: buntil.to_s)
    end
    target.save!

    @status = :okay
    @success = target.banned? == !unban
  end

  def privilege
    @status = :err
    @success = false

    params.require :user
    params.require :type
    params.require :status

    status = params[:status] == 'true'

    target_user = User.find_by_screen_name(params[:user])

    @message = I18n.t('messages.moderation.privilege.nope')
    return unless %w(moderator admin).include? params[:type].downcase

    unless current_user.has_role?(:administrator)
      @status = :nopriv
      @message = I18n.t('messages.moderation.privilege.nopriv')
      @success = false
      return
    end

    @checked = status
    type = params[:type].downcase
    target_role = {"admin" => "administrator"}.fetch(type, type).to_sym

    if status
      target_user.add_role target_role
    else
      target_user.remove_role target_role
    end
    target_user.save!

    @message = I18n.t('messages.moderation.privilege.checked', privilege: params[:type])

    @status = :okay
    @success = true
  end
end