# frozen_string_literal: true

# Copyright © 2008-2013 Michael Dvorkin and contributors. # # Fat Free CRM is freely distributable under the terms of MIT license. # See MIT-LICENSE file or www.opensource.org/licenses/mit-license.php —————————————————————————— namespace :ffcrm do

desc "Prepare the database"
task setup: :environment do
  if ENV["PROCEED"] != 'true'
    puts "\nFatFree CRM is about to run migrations on your database. Make sure you have a backup before proceeding.\n\n"
    proceed = false
    loop do
      print "Continue [yes/no]: "
      proceed = STDIN.gets.strip
      break unless proceed.blank?
    end

    # Don't continue unless user typed y(es)
    if proceed.match?(/y(?:es)*/i)
      Rake::Task["db:migrate"].invoke
      Rake::Task["ffcrm:setup:admin"].invoke
    else
      puts "Aborted setup."
    end
  end
end

namespace :setup do
  desc "Create admin user"
  task admin: :environment do
    username = ENV["USERNAME"]
    password = ENV["PASSWORD"]
    email = ENV["EMAIL"]
    unless username && password && email
      puts "\nTo create the admin user you will be prompted to enter username, password,"
      puts "and email address. You might also specify the username of existing user.\n"
      loop do
        username ||= "system"
        print "\nUsername [#{username}]: "
        reply = STDIN.gets.strip
        username = reply unless reply.blank?

        password ||= "manager"
        print "Password [#{password}]: "
        echo = lambda { |toggle|
          return if RUBY_PLATFORM.match?(/mswin/)

          system(toggle ? "stty echo && echo" : "stty -echo")
        }

        begin
          echo.call(false)
          reply = STDIN.gets.strip
          password = reply unless reply.blank?
        ensure
          echo.call(true)
        end

        loop do
          print "Email: "
          email = STDIN.gets.strip
          break unless email.blank?
        end

        puts "\nThe admin user will be created with the following credentials:\n\n"
        puts "  Username: #{username}"
        puts "  Password: #{'*' * password.length}"
        puts "     Email: #{email}\n\n"
        loop do
          print "Continue [yes/no/exit]: "
          reply = STDIN.gets.strip
          break unless reply.blank?
        end
        break if reply.match?(/y(?:es)*/i)

        redo if reply.match?(/no*/i)
        puts "No admin user was created."
        exit
      end
    end
    User.reset_column_information # Reload the class since we've added new fields in migrations.
    user = User.find_by_username(username) || User.new
    user.skip_confirmation!
    user.confirm
    user.update(username: username, password: password, email: email)
    user.update_attribute(:confirmed_at, Time.now.utc) # Skip confirmation
    user.update_attribute(:admin, true) # Mass assignments don't work for :admin because of the attr_protected
    user.update_attribute(:suspended_at, nil) # Mass assignments don't work for :suspended_at because of the attr_protected
    puts "Admin user has been created."
  end
end

end