# frozen_string_literal: true

require "csv"
require "yaml"
require_relative "../../base"

module ImportScripts::PhpBB3
  class Settings
    def self.load(filename)
      yaml = YAML.load_file(filename)
      Settings.new(yaml.deep_stringify_keys.with_indifferent_access)
    end

    attr_reader :site_name

    attr_reader :new_categories
    attr_reader :category_mappings
    attr_reader :tag_mappings
    attr_reader :rank_mapping

    attr_reader :import_anonymous_users
    attr_reader :import_attachments
    attr_reader :import_private_messages
    attr_reader :import_polls
    attr_reader :import_bookmarks
    attr_reader :import_passwords
    attr_reader :import_likes

    attr_reader :import_uploaded_avatars
    attr_reader :import_remote_avatars
    attr_reader :import_gallery_avatars

    attr_reader :use_bbcode_to_md

    attr_reader :original_site_prefix
    attr_reader :new_site_prefix
    attr_reader :base_dir
    attr_reader :permalinks

    attr_reader :username_as_name
    attr_reader :emojis
    attr_reader :custom_fields

    attr_reader :database

    def initialize(yaml)
      import_settings = yaml["import"]

      @site_name = import_settings["site_name"]

      @new_categories = import_settings["new_categories"]
      @category_mappings =
        import_settings.fetch("category_mappings", []).to_h { |m| [m[:source_category_id].to_s, m] }
      @tag_mappings = import_settings["tag_mappings"]
      @rank_mapping = import_settings["rank_mapping"]

      @import_anonymous_users = import_settings["anonymous_users"]
      @import_attachments = import_settings["attachments"]
      @import_private_messages = import_settings["private_messages"]
      @import_polls = import_settings["polls"]
      @import_bookmarks = import_settings["bookmarks"]
      @import_passwords = import_settings["passwords"]
      @import_likes = import_settings["likes"]

      avatar_settings = import_settings["avatars"]
      @import_uploaded_avatars = avatar_settings["uploaded"]
      @import_remote_avatars = avatar_settings["remote"]
      @import_gallery_avatars = avatar_settings["gallery"]

      @use_bbcode_to_md = import_settings["use_bbcode_to_md"]

      @original_site_prefix = import_settings["site_prefix"]["original"]
      @new_site_prefix = import_settings["site_prefix"]["new"]
      @base_dir = import_settings["phpbb_base_dir"]
      @permalinks = PermalinkSettings.new(import_settings["permalinks"])

      @username_as_name = import_settings["username_as_name"]
      @emojis = import_settings.fetch("emojis", [])
      @custom_fields = import_settings.fetch("custom_fields", [])

      @database = DatabaseSettings.new(yaml["database"])
    end

    def prefix(val)
      @site_name.present? && val.present? ? "#{@site_name}:#{val}" : val
    end

    def trust_level_for_posts(rank, trust_level: 0)
      if @rank_mapping.present?
        @rank_mapping.each do |key, value|
          trust_level = [trust_level, key.gsub("trust_level_", "").to_i].max if rank >= value
        end
      end

      trust_level
    end
  end

  class DatabaseSettings
    attr_reader :type
    attr_reader :host
    attr_reader :port
    attr_reader :username
    attr_reader :password
    attr_reader :schema
    attr_reader :table_prefix
    attr_reader :batch_size

    def initialize(yaml)
      @type = yaml["type"]
      @host = yaml["host"]
      @port = yaml["port"]
      @username = yaml["username"]
      @password = yaml["password"]
      @schema = yaml["schema"]
      @table_prefix = yaml["table_prefix"]
      @batch_size = yaml["batch_size"]
    end
  end

  class PermalinkSettings
    attr_reader :create_category_links
    attr_reader :create_topic_links
    attr_reader :create_post_links
    attr_reader :normalization_prefix

    def initialize(yaml)
      @create_category_links = yaml["categories"]
      @create_topic_links = yaml["topics"]
      @create_post_links = yaml["posts"]
      @normalization_prefix = yaml["prefix"]
    end
  end
end