# frozen_string_literal: true

module Jobs
  class MigrateUrlSiteSettings < ::Jobs::Onceoff
    SETTINGS = [
      ['logo_url', 'logo'],
      ['logo_small_url', 'logo_small'],
      ['digest_logo_url', 'digest_logo'],
      ['mobile_logo_url', 'mobile_logo'],
      ['large_icon_url', 'large_icon'],
      ['favicon_url', 'favicon'],
      ['apple_touch_icon_url', 'apple_touch_icon'],
      ['default_opengraph_image_url', 'opengraph_image'],
      ['twitter_summary_large_image_url', 'twitter_summary_large_image'],
      ['push_notifications_icon_url', 'push_notifications_icon'],
    ]

    def execute_onceoff(args)
      SETTINGS.each do |old_setting, new_setting|

        if (upload = SiteSetting.get(new_setting)) && upload.id >= Upload::SEEDED_ID_THRESHOLD
          logger.warn("Skipping migration of the Site Setting #{new_setting} to url cause upload #{upload} already exists for it")
          next
        end

        old_url = DB.query_single(
          "SELECT value FROM site_settings WHERE name = '#{old_setting}'"
        ).first

        next if old_url.blank?

        count = 0
        file = nil
        sleep_interval = 5

        loop do
          url = UrlHelper.absolute_without_cdn(old_url)

          begin
            file = FileHelper.download(
              url,
              max_file_size: [
                SiteSetting.max_image_size_kb.kilobytes,
                20.megabytes
              ].max,
              tmp_file_name: 'tmp_site_setting_logo',
              skip_rate_limit: true,
              follow_redirect: true
            )
          rescue OpenURI::HTTPError,
                 OpenSSL::SSL::SSLError,
                 Net::OpenTimeout,
                 Net::ReadTimeout,
                 Errno::ECONNREFUSED,
                 EOFError,
                 SocketError,
                 Discourse::InvalidParameters => e

            logger.warn(
              "Error encountered when trying to download file " +
              "for #{new_setting}.\n#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
            )
          end

          count += 1
          break if file || (file.blank? && count >= 3)

          logger.info(
            "Failed to download upload from #{url} for #{new_setting}. Retrying..."
          )

          sleep(count * sleep_interval)
        end

        next if file.blank?

        upload = UploadCreator.new(
          file,
          "#{new_setting}",
          origin: UrlHelper.absolute(old_url),
          for_site_setting: true
        ).create_for(Discourse.system_user.id)

        SiteSetting.set(new_setting, upload)
      end
    end

    private

    def logger
      Rails.logger
    end
  end
end
