#!/usr/bin/env ruby

require File.dirname(__FILE__) + '/../config/environment.rb'
require 'optparse'
require 'optparse/time'
require 'csv'

options = {}
options[:sep] = ';'

OptionParser.new do |opts|
  opts.banner = "Usage: user_delete users_list.csv [options]"

  opts.on("-s", "--separator", String, "fields separator (default is ;) ") do |l|
    options[:sep] = l
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    puts "Only email field"
    exit
  end

  options[:dryrun]=false
  opts.on('-d','--dryrun','dry run, show what will be done') do
    options[:dryrun]=true
  end

  options[:server]=''
  opts.on('-n server_name','--server server_name', String, 'server name') do |o|
    options[:server]=o
  end

end.parse!

if ARGV.blank?
  puts 'error : no arguments, use -h or --help for help'
  exit
end

ARGV.collect do |f|
  CSV.foreach(f,headers: false,col_sep: options[:sep]) do |user_line|
    email = user_line
    if options[:server].blank?
    user_to_delete = User.find_by(email: email)
    else
      user_to_delete = User.joins(title: :server).where(email: email, servers: {name: options[:server]}).first
    end

    begin

      if user_to_delete.nil?
        puts "Warning : No user found with email '#{email}' #{"on server #{options[:server]}" unless options[:server].blank?}"
      else

        if user_to_delete.title.nil?
          puts "Info : No title to delete for user with email '#{email}' #{"on server #{options[:server]}" unless options[:server].blank?}"
        else
          if options[:dryrun]
            puts "Title '#{user_to_delete.title.name}' would be deleted"
          else
            user_to_delete.title.destroy
            puts "Title '#{user_to_delete.title.name}' has been deleted"
          end
        end

        # if user_to_delete.crypted_password.blank? && user_to_delete.salt.blank? && user_to_delete.login_count.blank?
        if user_to_delete.login_count.blank?
          if options[:dryrun]
            puts "User '#{user_to_delete.email}' would be deleted"
          else
            user_to_delete.destroy
            puts "User '#{user_to_delete.email}' has been deleted"
          end
        else
          # reason = (user_to_delete.crypted_password > '' && user_to_delete.salt > '') ? "password reset" : "connection"
          # puts "Info : User '#{user_to_delete.email}' won't be deleted because they have been active (#{reason})"
          puts "Info : User '#{user_to_delete.email}' won't be deleted because they have been active (#{user_to_delete.login_count} connections)."
        end

      end

    rescue Exception => e
      puts "ERROR while deleting user '#{email}' -> : #{e}"
    end

  end
end