# frozen_string_literal: true

require "csv"
require File.expand_path(File.dirname(__FILE__) + "/base.rb")

# Import script for forums created via mybb.ru service (or anything else that uses this simple JSON format),
# using export format produced by https://github.com/AlexP11223/MybbRuUserscripts
# Set ENV variables, e.g. "export JSON_TOPICS_FILE=my_path/threads.json", or set/use the paths in the constants below
# If your forum has non-English usernames, don't forget to enable Unicode usernames in /admin/site_settings

class ImportScripts::MybbRu < ImportScripts::Base

  JSON_TOPICS_FILE_PATH ||= ENV['JSON_TOPICS_FILE'] || 'mybbru_export/threads.json'
  JSON_USERS_FILE_PATH ||= ENV['JSON_USERS_FILE'] || 'mybbru_export/users.json'

  def initialize
    super

    @imported_topics = load_json(JSON_TOPICS_FILE_PATH)
    @imported_users = load_json(JSON_USERS_FILE_PATH)
  end

  def execute
    puts "", "Importing from JSON file..."

    import_users
    import_categories
    import_discussions

    puts "", "Done"
  end

  def load_json(path)
    JSON.parse(File.read(path))
  end

  def clean_username(name)
    name.gsub(/ /, '')
  end

  def import_users
    puts '', "Importing users"

    create_users(@imported_users) do |u|
      {
        id: u['id'],
        username: clean_username(u['name']),
        email: u['email'],
        created_at: Time.now
      }
    end
  end

  def import_categories
    puts "", "importing categories..."

    categories = @imported_topics.map { |t| t['category'] }.uniq

    create_categories(categories) do |c|
      {
        id: c['id'],
        name: c['name']
      }
    end
  end

  def import_discussions
    puts "", "Importing discussions"

    @imported_topics.each do |t|
      first_post = t['posts'][0]

      create_posts(t['posts']) do |p|
        result = {
          id: p['id'],
          user_id: user_id_from_imported_user_id(p['author']['id']),
          raw: fix_post_content(p["source"]),
          created_at: Time.at(p['createdAt']),
          cook_method: Post.cook_methods[:regular]
        }

        if p['id'] == first_post['id']
          result[:category] = category_id_from_imported_category_id(t['category']['id'])
          result[:title] = t['title']
        else
          parent = topic_lookup_from_imported_post_id(first_post['id'])
          if parent
            result[:topic_id] = parent[:topic_id]
          else
            puts "Parent post #{first_post['id']} doesn't exist. Skipping #{p["id"]}: #{t["title"][0..40]}"
            break
          end
        end

        result
      end
    end
  end

  def fix_post_content(text)
    text
      .gsub(/\[code\]/, "\n[code]\n")
      .gsub(/\[\/code\]/, "\n[/code]\n")
      .gsub(/\[video\]/, "")
      .gsub(/\[\/video\]/, "")
      .gsub(/\[quote.*?\]/, "\n" + '\0' + "\n")
      .gsub(/\[\/quote\]/, "\n[/quote]\n")
      .gsub(/\[spoiler.*?\]/, "\n" + '\0' + "\n").gsub(/\[spoiler/, '[details')
      .gsub(/\[\/spoiler\]/, "\n[/details]\n")
  end
end

if __FILE__ == $0
  ImportScripts::MybbRu.new.perform
end