# frozen_string_literal: true

require "discourse_dev/record"
require "rails"
require "faker"

module DiscourseDev
  class Category < Record
    def initialize
      super(::Category, DiscourseDev.config.category[:count])
      @parent_category_ids = ::Category.where(parent_category_id: nil).pluck(:id)
    end

    def data
      name = Faker::Discourse.unique.category
      parent_category_id = nil

      if Faker::Boolean.boolean(true_ratio: 0.6)
        offset = Faker::Number.between(from: 0, to: @parent_category_ids.count - 1)
        parent_category_id = @parent_category_ids[offset]
        @permissions = ::Category.find(parent_category_id).permissions_params.presence
      else
        @permissions = nil
      end

      {
        name: name,
        description: Faker::Lorem.paragraph,
        user_id: ::Discourse::SYSTEM_USER_ID,
        color: Faker::Color.hex_color.last(6),
        parent_category_id: parent_category_id,
      }
    end

    def permissions
      return @permissions if @permissions.present?
      return { everyone: :full } if Faker::Boolean.boolean(true_ratio: 0.75)

      permission = {}
      group = Group.random
      permission[group.id] = Faker::Number.between(from: 1, to: 3)

      permission
    end

    def create!
      super do |category|
        category.set_permissions(permissions)
        category.save!

        @parent_category_ids << category.id if category.parent_category_id.blank?
      end
    end

    def self.random
      super(::Category)
    end
  end
end
