namespace :versions do
  desc 'Generate a new release name'
  task generate_release_name: :environment do
    def rand_el(arr)
      arr[rand(arr.count)]
    end

    # Load the data from JSON
    adjectives = JSON.parse(File.read('lib/tasks/versions/adjectives.json'))
    scientists = JSON.parse(File.read('lib/tasks/versions/scientists.json'))

    puts '------------------------------------'
    puts ''
    puts 'sciNote release name generator v0.1 ALPHA'
    puts ''
    puts '------------------------------------'

    puts ''
    puts 'Choose what you would like to do:'
    puts '1) Provide a scientist by yourself'
    puts '2) Randomly choose a scientist from a pre-defined list'
    res = $stdin.gets.strip
    unless res.in?(['', '1', '2'])
      puts 'Invalid parameter, exiting'
      next
    end

    # First, pick scientist name
    if res.in?(['', '1'])
      puts 'Enter full scientist first name (all but surname) ' \
           'in capitalized case'
      first_name = $stdin.gets.strip
      puts 'Enter full scientist surname ' \
           'in capitalized case'
      last_name = $stdin.gets.strip
      key = last_name[0].downcase.to_sym
      full_name = "#{first_name} #{last_name}"
    else
      key = rand_el(scientists.keys)
      full_name = rand_el(scientists[key])
      last_name = full_name.split(' ')[-1]
      puts "Randomly chosen scientist: #{full_name}"
      puts ''
    end

    # Now, pick adjective
    adjective = rand_el(adjectives[key])

    puts '------------------------------------'
    puts 'Tadaaaa!'
    puts 'The new release will be named......'
    puts '(waaaaait for iiiiit)'
    puts ''
    puts '##############################################'
    puts " #{adjective.capitalize} #{last_name}"
    puts " (full name: #{full_name})"
    puts '##############################################'

    loop do
      puts ''
      puts 'What would you like to do?'
      puts '(E) Exit'
      puts '(a) generate new adjective'
      puts '(s) generate new random scientist'
      res = $stdin.gets.strip
      unless res.in?(['', 'e', 'E', 'a', 'A', 's', 'S'])
        puts 'Invalid parameter!'
        next
      end

      break if res.in?(['', 'e', 'E'])

      if res.in?(%w(s S))
        key = rand_el(scientists.keys)
        full_name = rand_el(scientists[key])
        last_name = full_name.split(' ')[-1]
      end

      adjective = rand_el(adjectives[key])

      puts ''
      puts '##############################################'
      puts " #{adjective.capitalize} #{last_name} "
      puts " (full name: #{full_name})"
      puts '##############################################'
    end
  end
end