class CommonsController < ApplicationController
  OBJECT_TYPE = %W[message journals_for_message]

  before_action :require_login, :check_auth
  before_action :validate_object_type
  before_action :find_object
  before_action :validate_power

  def delete
    begin
      @object.destroy!
    rescue Exception => e
      uid_logger_error(e.message)
      tip_exception(e.message)
      raise ActiveRecord::Rollback
    end
  end

  def hidden
    action(true)
  end

  def unhidden
    action(false)
  end

  private
  def find_object
    begin
      @object = params[:object_type].strip.classify.constantize.find params[:object_id]
    rescue Exception => e
      uid_logger_error(e.message)
      tip_exception(e.message)
      return
    end
  end

  def validate_object_type
    return normal_status(2, "缺少object_id参数") if params[:object_id].blank?
    return normal_status(2, "缺少object_type参数") if params[:object_type].blank?
    return normal_status(2, "object_type参数格式错误") unless OBJECT_TYPE.include? params[:object_type].strip
  end

  def validate_power
    code =
      case params[:object_type].strip
      when 'message'
        if current_user.course_identity(@object.board.course) >= Course::STUDENT && @object.author != current_user
          403
        else
          200
        end
      when 'journals_for_message'
        course = @object&.jour_type.to_s == "StudentWorksScore" ? @object.jour&.student_work&.homework_common&.course : @object.jour&.course
        if current_user.course_identity(course)  >= Course::STUDENT && @object.user != current_user
          403
        else
          200
        end
      else
        current_user.admin_or_business? ? 200 : 403
      end
    return normal_status(code, "你没有权限操作！") if code == 403
  end

  def action(flag)
    begin
      @object.has_attribute?(:is_hidden) ? @object.update_attributes(:is_hidden => flag )
          : @object.update_attributes(:hidden => flag )
    rescue Exception => e
      uid_logger_error(e.message)
      tip_exception(e.message)
      raise ActiveRecord::Rollback
    end
  end
end
