class Setting < ApplicationRecord
  THEMES = ['system', 'light', 'dark'].freeze

  # These remain in the typed settings schema to preserve existing backend
  # work. The common `/users/settings` page currently surfaces only `theme`.
  AUTO_FETCH_MODES = ['auto', 'manual', 'off'].freeze
  WIKI_EDITOR_MODES = ['split', 'write', 'preview'].freeze

  STRING_ATTRIBUTES = [
    'theme',
    'auto_fetch_title',
    'auto_fetch_thumbnail',
    'wiki_editor_mode',
  ].freeze
  INTEGER_ATTRIBUTES = [].freeze
  BOOLEAN_ATTRIBUTES = [].freeze
  EDITABLE_ATTRIBUTES =
      (STRING_ATTRIBUTES + INTEGER_ATTRIBUTES + BOOLEAN_ATTRIBUTES).freeze
  TYPE_BY_ATTRIBUTE = {
    'theme' => :string,
    'auto_fetch_title' => :string,
    'auto_fetch_thumbnail' => :string,
    'wiki_editor_mode' => :string,
  }.freeze

  belongs_to :user

  validates :user_id, presence: true
  validates :user_id, uniqueness: true

  validates :theme, inclusion: { in: THEMES }
  validates :auto_fetch_title, inclusion: { in: AUTO_FETCH_MODES }
  validates :auto_fetch_thumbnail, inclusion: { in: AUTO_FETCH_MODES }
  validates :wiki_editor_mode, inclusion: { in: WIKI_EDITOR_MODES }

  def self.defaults
    {
      theme: 'system',
      auto_fetch_title: 'manual',
      auto_fetch_thumbnail: 'manual',
      wiki_editor_mode: 'split',
    }
  end

  def self.serializable_attributes
    EDITABLE_ATTRIBUTES.map(&:to_sym)
  end

  def serializable_hash(options = nil)
    super({ only: self.class.serializable_attributes }.merge(options || { }))
  end
end
