# frozen_string_literal: true

class ImapSyncLog < ActiveRecord::Base
  RETAIN_LOGS_DAYS ||= 5

  belongs_to :group

  def self.levels
    @levels ||= Enum.new(:debug, :info, :warn, :error)
  end

  def self.log(message, level, group_id = nil, db = true)
    now = Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")

    new_log = (create(message: message, level: ImapSyncLog.levels[level], group_id: group_id) if db)

    if ENV["DEBUG_IMAP"]
      Rails.logger.send(
        :warn,
        "#{level[0].upcase}, [#{now}] [IMAP] (group_id #{group_id}) #{message}",
      )
    else
      Rails.logger.send(
        level,
        "#{level[0].upcase}, [#{now}] [IMAP] (group_id #{group_id}) #{message}",
      )
    end

    new_log
  end

  def self.debug(message, group_or_id, db: true)
    group_id = group_or_id.is_a?(Integer) ? group_or_id : group_or_id.id
    log(message, :debug, group_id, db)
  end

  def self.info(message, group_or_id)
    group_id = group_or_id.is_a?(Integer) ? group_or_id : group_or_id.id
    log(message, :info, group_id)
  end

  def self.warn(message, group_or_id)
    group_id = group_or_id.is_a?(Integer) ? group_or_id : group_or_id.id
    log(message, :warn, group_id)
  end

  def self.error(message, group_or_id)
    group_id = group_or_id.is_a?(Integer) ? group_or_id : group_or_id.id
    log(message, :error, group_id)
  end
end

# == Schema Information
#
# Table name: imap_sync_logs
#
#  id         :bigint           not null, primary key
#  level      :integer          not null
#  message    :string           not null
#  group_id   :bigint
#  created_at :datetime         not null
#  updated_at :datetime         not null
#
# Indexes
#
#  index_imap_sync_logs_on_group_id  (group_id)
#  index_imap_sync_logs_on_level     (level)
#