# frozen_string_literal: true

# Generates posts and topics
class Populate < Thor
  desc "posts", "Generate posts"
  long_desc <<-MD
    Create topics with any number of posts, or add posts to an existing topic.

    Examples:

    Create a new topic with 100 posts from batman and spiderman:

    > $ thor populate:posts -n 100 -u batman spiderman -t "So many posts"

    Add 10 posts to topic with id 123:

    > $ thor populate:posts -n 10 -u batman spiderman -i 123

    Generate 10 topics with 5 posts:

    > $ thor populate:posts -p 10 -n 5

  MD
  method_option :num_posts,
                aliases: "-n",
                type: :numeric,
                required: true,
                desc: "Number of posts to make"
  method_option :users,
                aliases: "-u",
                type: :array,
                desc: "Usernames of users who will make the posts"
  method_option :title, aliases: "-t", desc: "The title of the topic, if making a new topic"
  method_option :topic_id,
                aliases: "-i",
                type: :numeric,
                desc: "The id of the topic where the posts will be added"
  method_option :num_topics,
                aliases: "-p",
                type: :numeric,
                default: 1,
                desc: "Number of topics to create"

  def posts
    require "./config/environment"
    users = []
    if options[:users]
      options[:users].each do |u|
        provided_user = User.find_by_username(u.downcase)
        puts "No user found: #{provided_user}" if provided_user.nil?
        users << provided_user if provided_user
      end
    else
      10.times do
        user = create_user(generate_email)
        users << user
      end
    end
    RateLimiter.disable
    options[:num_topics].times do
      topic = Topic.find_by(id: options[:topic_id])
      start_post = 1
      topic = create_topic(users) unless topic
      puts "Adding posts to '#{topic.title}'"
      puts "Making #{options[:num_posts]} posts"
      (start_post..options[:num_posts]).each { create_post(users, topic) }
      puts ""
      puts "Done. Topic id = #{topic.id}"
    end
  ensure
    RateLimiter.enable
  end

  private

  def create_user(user_email)
    user = User.find_by_email(user_email)
    unless user
      puts "Creating new account: #{user_email}"
      user =
        User.create!(
          email: user_email,
          password: SecureRandom.hex,
          username: UserNameSuggester.suggest(user_email),
        )
    end
    user.active = true
    user.save!
    user
  end

  def create_topic(users)
    topic_title = options[:title] || generate_sentence(5)
    puts "Making a new topic: '#{topic_title}'"
    post_creator = PostCreator.new(users.sample, title: topic_title, raw: generate_sentence(7))
    first_post = post_creator.create
    unless first_post
      puts post_creator.errors.full_messages, ""
      raise StandardError.new(post_creator.errors.full_messages)
    end
    topic = first_post.topic
    start_post = 2
    topic
  end

  def create_post(users, topic)
    print "."
    raw =
      (
        if rand(4) == 0
          (rand(2) == 0 ? image_posts.sample : wikipedia_posts.sample)
        else
          generate_sentence(7)
        end
      )
    post_creator = PostCreator.new(users.sample, topic_id: topic.id, raw: raw)
    post = post_creator.create
    puts post_creator.errors.full_messages, "" unless post
    post
  end

  def hipster_words
    @hipster_words ||= [
      "etsy",
      "twee",
      "hoodie",
      "Banksy",
      "retro",
      "synth",
      "single-origin",
      "coffee",
      "art",
      "party",
      "cliche",
      "artisan",
      "Williamsburg",
      "squid",
      "helvetica",
      "keytar",
      "American Apparel",
      "craft beer",
      "food truck",
      "you probably haven't heard of them",
      "cardigan",
      "aesthetic",
      "raw denim",
      "sartorial",
      "gentrify",
      "lomo",
      "Vice",
      "Pitchfork",
      "Austin",
      "sustainable",
      "salvia",
      "organic",
      "thundercats",
      "PBR",
      "iPhone",
      "lo-fi",
      "skateboard",
      "jean shorts",
      "next level",
      "beard",
      "tattooed",
      "trust fund",
      "Four Loko",
      "master cleanse",
      "ethical",
      "high life",
      "wolf moon",
      "fanny pack",
      "Terry Richardson",
      "8-bit",
      "Carles",
      "Shoreditch",
      "seitan",
      "freegan",
      "keffiyeh",
      "biodiesel",
      "quinoa",
      "farm-to-table",
      "fixie",
      "viral",
      "chambray",
      "scenester",
      "leggings",
      "readymade",
      "Brooklyn",
      "Wayfarers",
      "Marfa",
      "put a bird on it",
      "dreamcatcher",
      "photo booth",
      "tofu",
      "mlkshk",
      "vegan",
      "vinyl",
      "DIY",
      "banh mi",
      "bicycle rights",
      "before they sold out",
      "gluten-free",
      "yr butcher blog",
      "whatever",
      "+1",
      "Cosby Sweater",
      "VHS",
      "messenger bag",
      "cred",
      "locavore",
      "mustache",
      "tumblr",
      "Portland",
      "mixtape",
      "fap",
      "letterpress",
      "McSweeney's",
      "stumptown",
      "brunch",
      "Wes Anderson",
      "irony",
      "echo park",
    ]
  end

  def generate_sentence(num_words)
    sentence = hipster_words.sample(num_words).join(" ").capitalize + "."
    sentence.force_encoding("UTF-8")
  end

  def generate_email
    email = hipster_words.sample.delete(" ") + "@" + hipster_words.sample.delete(" ") + ".com"
    email.delete("'").force_encoding("UTF-8")
  end

  def image_posts
    @image_posts ||= [
      "http://i.imgur.com/CnRF48R.jpg\n\n",
      "http://i.imgur.com/2iaeK.png\n\n",
      "http://i.imgur.com/WSD5t61.jpg\n\n",
      "http://i.imgur.com/GUldmUd.jpg\n\n",
      "http://i.imgur.com/nJnb6Bj.jpg\n\n",
      "http://i.imgur.com/eljDYjm.jpg\n\n",
      "http://i.imgur.com/5yZMWyY.png\n\n",
      "http://i.imgur.com/2iCPGm2.jpg\n\n",
    ]
  end

  def wikipedia_posts
    @wikipedia_posts ||= [
      "http://en.wikipedia.org/wiki/Dwarf_fortress\n\n",
      "http://en.wikipedia.org/wiki/Action_plan\n\n",
      "http://en.wikipedia.org/wiki/Chang%27e_3\n\n",
      "http://en.wikipedia.org/wiki/Carl_sagan\n\n",
      "http://en.wikipedia.org/wiki/Chasmosaurus\n\n",
      "http://en.wikipedia.org/wiki/Indian_Space_Research_Organisation\n\n",
      "http://en.wikipedia.org/wiki/Rockstar_Consortium\n\n",
      "http://en.wikipedia.org/wiki/Manitoulin_island\n\n",
    ]
  end
end