module AuditLog
  module Auditable
    extend ActiveSupport::Concern

    included do
      self.table_name = "audit_logs"

      serialize :payload, JSON
      serialize :request, JSON

      belongs_to :user, class_name: AuditLog.config.user_class, required: false
      belongs_to :record, polymorphic: true, required: false

      validates :action, presence: true

      after_initialize :initialize_payload_request
      before_destroy :stop_destroy
    end

    def initialize_payload_request
      self.payload = {} if payload.nil?
      self.request = {} if request.nil?
    end

    def stop_destroy
      errors.add(:base, :undestroyable)
      throw :abort
    end

    def user_name
      return "none" if user.blank?

      user.send(AuditLog.config.user_name_method)
    end

    def action_name
      I18n.t("audit_log.action.#{action}", default: action)
    end
  end
end
