example = 'GD_ENV=testing GD_SPEC_PASSWORD=secret bundle exec ruby bin/test_projects_cleanup.rb'

if ARGV.include?('-h')
  puts 'Example:'
  puts example
  exit 0
end

require 'gooddata'
require_relative '../spec/environment/environment'
GoodData::Environment.load
config = GoodData::Environment::ConnectionHelper::LCM_ENVIRONMENT
secrets = GoodData::Environment::ConnectionHelper::SECRETS

def delete_project_by_title(title, projects, days = 14, force = false)
  dead_line = Time.now - days * 60 * 60 * 24
  filtered_projects = projects.select do |p|
    p.title.match(title) && p.created < dead_line
  end
  filtered_projects.each do |project|
    if force
      puts "Deleting: #{project.pid} - #{project.title} - #{project.created}"
      project_add = project.add
      project_add && project_add.output_stage && project_add.output_stage.delete
      project.delete
    else
      puts "Would delete: #{project.pid} - #{project.title} - #{project.created}"
    end
  end
  puts "#{filtered_projects.length} projects matching \"#{title}\" #{'would be ' unless force}deleted."
end

def delete_ads_by_title(title, client, days = 14, force = false)
  warehouses = client.warehouses
  return if warehouses.empty?

  deleted = 0
  warehouses.each do |warehouse|
    warehouse_title = warehouse.title
    next unless warehouse_title.match(title)

    dead_line = Time.now - days * 60 * 60 * 24
    created = Time.parse(warehouse.data["created"])
    next if created > dead_line

    begin
      if force
        puts "Deleting: #{warehouse_title} - #{created}"
        warehouse.delete
      else
        puts "Would delete:  #{warehouse_title} - #{created}"
      end
      deleted += 1
    rescue StandardError => e
      puts "Failed to delete #{warehouse_title}: #{e}"
    end
  end
  puts "#{deleted} ADS instances with title \"#{title}\" #{'would be ' unless force}deleted."
end

def clean_up!(client, force, days)
  projects = client.projects
  delete_project_by_title(/Insurance Demo Master/, projects, days, force)
  delete_project_by_title(/Car Demo Master/, projects, days, force)
  delete_project_by_title(/Insurance Demo Workspace/, projects, days, force)
  delete_project_by_title(/Client With Conflicting LDM/, projects, days, force)
  delete_project_by_title(/Development Project/, projects, days, force)
  delete_project_by_title(/lcm-test-fixture/, projects, days, force)
  delete_project_by_title(/Test MASTER project/, projects, days, force)
  delete_project_by_title(/Test MINOR project/, projects, days, force)
  delete_project_by_title(/^Test project$/, projects, days, force)
  delete_project_by_title(/userprov-e2e-testing/, projects, days, force)
  delete_ads_by_title(/Development ADS/, client, days, force)
  delete_ads_by_title(/Production ADS/, client, days, force)
end

def init_client(username, password, server)
  GoodData.connect(
    username,
    password,
    server: server,
    verify_ssl: false,
    timeout: nil
  )
end

username = config[:username]
password = secrets[:password]
dev_client = init_client(username, password, "https://#{config[:dev_server]}")
prod_client = init_client(username, password, "https://#{config[:prod_server]}")

force = ARGV.include?('-f')
days = 14
clean_up!(dev_client, force, days)
clean_up!(prod_client, force, days)

dev_client.disconnect