# frozen_string_literal: true

namespace :clickhouse do

task prepare_schema_migration_table: :environment do
  ClickhouseActiverecord::SchemaMigration.create_table unless ENV['simple'] || ARGV.map{|a| a.include?('--simple') ? true : nil}.compact.any?
end

task prepare_internal_metadata_table: :environment do
  ClickhouseActiverecord::InternalMetadata.create_table unless ENV['simple'] || ARGV.map{|a| a.include?('--simple') ? true : nil}.compact.any?
end

task load_config: :environment do
  ENV['SCHEMA'] = "db/clickhouse_schema.rb"
  ActiveRecord::Migrator.migrations_paths = ["db/migrate_clickhouse"]
  ActiveRecord::Base.establish_connection(:"#{Rails.env}_clickhouse")
end

namespace :schema do

  # todo not testing
  desc 'Load database schema'
  task load: [:load_config, :prepare_internal_metadata_table] do |t, args|
    simple = ENV['simple'] || ARGV.map{|a| a.include?('--simple') ? true : nil}.compact.any? ? '_simple' : nil
    ClickhouseActiverecord::SchemaMigration.drop_table
    load("#{Rails.root}/db/clickhouse_schema#{simple}.rb")
  end

  desc 'Dump database schema'
  task dump: :environment do |t, args|
    simple = ENV['simple'] || args[:simple] || ARGV.map{|a| a.include?('--simple') ? true : nil}.compact.any? ? '_simple' : nil
    filename = "#{Rails.root}/db/clickhouse_schema#{simple}.rb"
    File.open(filename, 'w:utf-8') do |file|
      ActiveRecord::Base.establish_connection(:"#{Rails.env}_clickhouse")
      ClickhouseActiverecord::SchemaDumper.dump(ActiveRecord::Base.connection, file, ActiveRecord::Base, !!simple)
    end
  end

end

namespace :structure do
  desc 'Load database structure'
  task load: [:load_config, 'db:check_protected_environments'] do
    ClickhouseActiverecord::Tasks.new(ActiveRecord::Base.configurations["#{Rails.env}_clickhouse"]).structure_load("#{Rails.root}/db/clickhouse_structure.sql")
  end

  desc 'Dump database structure'
  task dump: [:load_config, 'db:check_protected_environments'] do
    ClickhouseActiverecord::Tasks.new(ActiveRecord::Base.configurations["#{Rails.env}_clickhouse"]).structure_dump("#{Rails.root}/db/clickhouse_structure.sql")
  end
end

desc 'Creates the database from DATABASE_URL or config/database.yml'
task create: [:load_config] do
  ActiveRecord::Tasks::DatabaseTasks.create(ActiveRecord::Base.configurations["#{Rails.env}_clickhouse"])
end

desc 'Drops the database from DATABASE_URL or config/database.yml'
task drop: [:load_config, 'db:check_protected_environments'] do
  ActiveRecord::Tasks::DatabaseTasks.drop(ActiveRecord::Base.configurations["#{Rails.env}_clickhouse"])
end

desc 'Empty the database from DATABASE_URL or config/database.yml'
task purge: [:load_config, 'db:check_protected_environments'] do
  ActiveRecord::Tasks::DatabaseTasks.purge(ActiveRecord::Base.configurations["#{Rails.env}_clickhouse"])
end

# desc 'Resets your database using your migrations for the current environment'
task reset: :load_config do
  Rake::Task['clickhouse:purge'].execute
  Rake::Task['clickhouse:migrate'].execute
end

desc 'Migrate the clickhouse database'
task migrate: [:load_config, :prepare_schema_migration_table, :prepare_internal_metadata_table] do
  Rake::Task['db:migrate'].execute
  if File.exists? "#{Rails.root}/db/clickhouse_schema_simple.rb"
    Rake::Task['clickhouse:schema:dump'].execute(simple: true)
  end
end

desc 'Rollback the clickhouse database'
task rollback: [:load_config, :prepare_schema_migration_table, :prepare_internal_metadata_table] do
  Rake::Task['db:rollback'].execute
end

end