# frozen_string_literal: true
class CustomWizard::Log
  include ActiveModel::Serialization

  attr_reader :date, :wizard_id, :action, :username, :message
  attr_accessor :user

  PAGE_LIMIT = 100

  def initialize(attrs)
    @date = attrs["date"]
    @action = attrs["action"]
    @message = attrs["message"]
    @wizard_id = attrs["wizard_id"]
    @username = attrs["username"]
  end

  def self.create(wizard_id, action, username, message, date = Time.now)
    log_id = SecureRandom.hex(12)

    PluginStore.set(
      "custom_wizard_log",
      log_id.to_s,
      { date: date, wizard_id: wizard_id, action: action, username: username, message: message },
    )
  end

  def self.list_query(wizard_id = nil)
    query =
      PluginStoreRow.where(
        "plugin_name = 'custom_wizard_log' AND (value::json->'date') IS NOT NULL",
      )
    query = query.where("(value::json->>'wizard_id') = ?", wizard_id) if wizard_id
    query.order("value::json->>'date' DESC")
  end

  def self.list(page = 0, limit = nil, wizard_id = nil)
    limit = limit.to_i > 0 ? limit.to_i : PAGE_LIMIT
    page = page.to_i
    logs = self.list_query(wizard_id)

    result = OpenStruct.new(logs: [], total: nil)
    result.total = logs.size
    result.logs = logs.limit(limit).offset(page * limit).map { |r| self.new(JSON.parse(r.value)) }

    result
  end
end