# frozen_string_literal: true

require "yaml"

desc "Exports site settings"
task "site_settings:export" => :environment do
  h = SiteSettingsTask.export_to_hash
  puts h.to_yaml
end

desc "Imports site settings"
task "site_settings:import" => :environment do
  yml = (STDIN.tty?) ? "" : STDIN.read
  if yml == ""
    puts
    puts "Please specify a settings yml file"
    puts "Example: rake site_settings:import < settings.yml"
    exit 1
  end

  puts
  puts "starting import..."
  puts

  log, counts = SiteSettingsTask.import(yml)

  puts log

  puts
  puts "Results:"
  puts " Updated:   #{counts[:updated]}"
  puts " Not Found: #{counts[:not_found]}"
  puts " Errors:    #{counts[:errors]}"

  exit 1 if counts[:not_found] + counts[:errors] > 0
end

# Outputs a list of Site Settings that may no longer be in use
desc "Find dead site settings"
task "site_settings:find_dead" => :environment do
  setting_names = SiteSettingsTask.names

  setting_names.each do |n|
    if !SiteSetting.respond_to?(n)
      # Likely won't hit here, but just in case
      puts "Setting #{n} does not exist."
    end
  end

  directories = SiteSettingsTask.directories
  dead_settings = []

  if !SiteSettingsTask.rg_installed?
    puts "Please install ripgrep to use this command"
    exit 1
  end

  if !ENV["ALL_THE_PARENT_DIR"]
    puts "To specify a custom parent directory for all-the-themes & all-the-plugins"
    puts "use the ALL_THE_PARENT_DIR ENV var."
  end
  puts "Checking #{setting_names.count} settings in these directories:"
  puts directories
  puts

  setting_names.each do |setting_name|
    count = SiteSettingsTask.rg_search_count("SiteSetting.#{setting_name}", directories.first)
    count =
      SiteSettingsTask.rg_search_count(
        "siteSettings.#{setting_name}",
        directories.first,
      ) if count.zero?
    directories.each do |directory|
      count = SiteSettingsTask.rg_search_count(setting_name, directory) if count.zero?
    end
    if count.zero?
      print setting_name
      dead_settings << setting_name
    else
      print "."
    end
  end

  puts

  if dead_settings.count > 0
    puts "These settings may be unused:"
    puts dead_settings
  else
    puts "No dead settings found."
  end
end

desc "Add missing keyword translation keys"
task "site_settings:add_keyword_translation_keys" => :environment do
  # Manually load the YAML file, since we need to manually dump it at the end
  filename = "#{Rails.root}/config/locales/server.en.yml"

  text = File.read(filename)
  yml = YAML.load_file(filename, aliases: true)

  new_keywords = {}

  added = 0

  yml["en"]["site_settings"].each do |key, value|
    next if !value.is_a?(String)

    if yml["en"]["site_settings"]["keywords"].key?(key)
      new_keywords[key] = yml["en"]["site_settings"]["keywords"][key]
    else
      new_keywords[key] = ""
      added += 1
    end
  end

  removed = yml["en"]["site_settings"]["keywords"].length - new_keywords.length - added

  new_text = ""
  new_keywords.keys.sort.each { |key| new_text += "      #{key}: \"#{new_keywords[key]}\"\n" }

  text.gsub!(/(# BEGIN KEYWORDS\n)(.*)(      # END KEYWORDS)/m, "\\1#{new_text}\\3")

  File.write(filename, text)

  puts "Keyword entries added: #{added}"
  puts "Keyword entries removed: #{removed}"
end