# frozen_string_literal: true

require "bundler/gem_tasks"
require "minitest/test_task"
require "azure_blob"
require_relative "test/support/app_service_vpn"
require_relative "test/support/azure_vm_vpn"
require_relative "test/support/azurite"

Minitest::TestTask.create(:test_rails) do
  self.test_globs = [ "test/rails/**/test_*.rb",
                     "test/rails/**/*_test.rb", ]
end

Minitest::TestTask.create(:test_client) do
  self.test_globs = [ "test/client/**/test_*.rb",
                     "test/client/**/*_test.rb", ]
end

task default: %i[test]

task :test do
  [
    "AZURE_ACCOUNT_NAME",
    "AZURE_PRIVATE_CONTAINER",
    "AZURE_PUBLIC_CONTAINER",
  ].each do |env|
    value = ENV[env]
    raise "#{env} variable need to be set if you are using the nix/devenv environment, consider running generate-env-file" if value.nil? || value.empty?
  end

  Rake::Task["test_client"].execute
  Rake::Task["test_rails"].execute
end

task :test_app_service do |t|
  vpn = AppServiceVpn.new
  ENV["IDENTITY_ENDPOINT"] = vpn.endpoint
  ENV["IDENTITY_HEADER"] = vpn.header
  Rake::Task["test_entra_id"].execute
ensure
  vpn.kill
end

task :test_azure_vm do |t|
  vpn = AzureVmVpn.new
  Rake::Task["test_entra_id"].execute
ensure
  vpn.kill
end

task :test_azurite do |t|
  azurite = Azurite.new
  # Azurite well-known credentials
  # https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio%2Cblob-storage#well-known-storage-account-and-key
  account_name = ENV["AZURE_ACCOUNT_NAME"] = "devstoreaccount1"
  access_key = ENV["AZURE_ACCESS_KEY"] = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
  host = ENV["STORAGE_BLOB_HOST"] = "http://127.0.0.1:10000/devstoreaccount1"
  ENV["TESTING_AZURITE"] = "true"

  # Create containers
  private_container = AzureBlob::Client.new(account_name:, access_key:, host:, container: ENV["AZURE_PRIVATE_CONTAINER"])
  public_container = AzureBlob::Client.new(account_name:, access_key:, host:, container: ENV["AZURE_PUBLIC_CONTAINER"])
  # public_container.delete_container
  private_container.create_container unless private_container.get_container_properties.present?
  public_container.create_container(public_access: true) unless public_container.get_container_properties.present?

  Rake::Task["test_client"].execute
  Rake::Task["test_rails"].execute
ensure
  azurite.kill
end

task :test_entra_id do |t|
  ENV["AZURE_ACCESS_KEY"] = nil
  Rake::Task["test"].execute
end

task :flush_test_container do |t|
  AzureBlob::Client.new(
    account_name: ENV["AZURE_ACCOUNT_NAME"],
    access_key: ENV["AZURE_ACCESS_KEY"],
    container: ENV["AZURE_PRIVATE_CONTAINER"],
  ).delete_prefix ""
  AzureBlob::Client.new(
    account_name: ENV["AZURE_ACCOUNT_NAME"],
    access_key: ENV["AZURE_ACCESS_KEY"],
    container: ENV["AZURE_PUBLIC_CONTAINER"],
  ).delete_prefix ""
end
