# frozen_string_literal: true

require_relative 'boot'

require 'rails'
# Pick the frameworks you want:
require 'active_model/railtie'
require 'active_job/railtie'
require 'active_record/railtie'
# require "active_storage/engine"
require 'action_controller/railtie'
require 'action_mailer/railtie'
# require "action_mailbox/engine"
# require "action_text/engine"
require 'action_view/railtie'
# require "action_cable/engine"
require 'sprockets/railtie'
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Genkan
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.1

    # Configuration for the application, engines, and railties goes here.
    #
    # These settings can be overridden in specific environments using the files
    # in config/environments, which are processed later.
    #
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")

    # Don't generate system test files.
    config.generators.system_tests = nil

    # Set up default logger
    config.logger = Logger.new($stderr)

    # Configure JWT
    if credentials.jwt.present?
      config.jwt_algorithm = credentials.jwt[:algorithm]
      config.jwt_private_key = OpenSSL::PKey.read(credentials.jwt[:private_key])
      config.jwt_public_key = OpenSSL::PKey.read(credentials.jwt[:public_key])
    elsif Rails.env.production?
      config.logger.error 'Production mode requires configuration of Rails credentials'
    else
      config.logger.warn 'No credentials found; generating random key.'
      # Just generate a new key at startup when we don't have credentials
      config.jwt_algorithm = 'RS256'
      config.jwt_private_key = OpenSSL::PKey::RSA.generate(2048)
      config.jwt_public_key = config.jwt_private_key.public_key
    end

    # Configure Redis
    redis_config = config_for(:redis)
    config.redis = ConnectionPool.new(redis_config[:pool] || {}) { Redis.new(redis_config) }
  end
end
