require "rubygems"
require "rubygems/package_task"
require "rake/extensiontask" unless RUBY_PLATFORM == "java"
require "rake/testtask"
import 'lib/google/tasks/ffi.rake'

spec = Gem::Specification.load("google-protobuf.gemspec")

well_known_protos = %w[
  google/protobuf/any.proto
  google/protobuf/api.proto
  google/protobuf/descriptor.proto
  google/protobuf/duration.proto
  google/protobuf/empty.proto
  google/protobuf/field_mask.proto
  google/protobuf/source_context.proto
  google/protobuf/struct.proto
  google/protobuf/timestamp.proto
  google/protobuf/type.proto
  google/protobuf/wrappers.proto
]

test_protos = %w[
  tests/basic_test.proto
  tests/basic_test_features.proto
  tests/basic_test_proto2.proto
  tests/generated_code.proto
  tests/generated_code_proto2.proto
  tests/generated_code_editions.proto
  tests/multi_level_nesting_test.proto
  tests/repeated_field_test.proto
  tests/service_test.proto
  tests/stress.proto
  tests/test_import.proto
  tests/test_import_proto2.proto
  tests/test_ruby_package.proto
  tests/test_ruby_package_proto2.proto
]

# These are omitted for now because we don't support proto2.
proto2_protos = %w[
  google/protobuf/descriptor.proto
  google/protobuf/compiler/plugin.proto
]

if !ENV['PROTOC'].nil?
  protoc_command = ENV['PROTOC']
elsif system('../bazel-bin/protoc --version')
  protoc_command = '../bazel-bin/protoc'
else
  protoc_command = 'protoc'
end

genproto_output = []

# We won't have access to .. from within docker, but the proto files
# will be there, thanks to the :genproto rule dependency for gem:native.
unless ENV['IN_DOCKER'] == 'true' or ENV['BAZEL'] == 'true'
  well_known_protos.each do |proto_file|
    input_file = "../src/" + proto_file
    output_file = "lib/" + proto_file.sub(/\.proto$/, "_pb.rb")
    genproto_output << output_file
    file output_file => input_file do |file_task|
      sh "#{protoc_command} -I../src --ruby_out=lib #{input_file}"
    end
  end

  test_protos.each do |proto_file|
    output_file = proto_file.sub(/\.proto$/, "_pb.rb")
    genproto_output << output_file
    file output_file => proto_file do |file_task|
      sh "#{protoc_command} -I../src -I./tests --ruby_out=tests  #{proto_file}"
    end
  end
end

task :copy_third_party do
  unless File.exist? 'ext/google/protobuf_c/third_party/utf8_range'
    FileUtils.mkdir_p 'ext/google/protobuf_c/third_party/utf8_range'
    # We need utf8_range in-tree.
    utf8_root = '../third_party/utf8_range'
    %w[
      utf8_range.h utf8_range.c LICENSE
    ].each do |file|
      FileUtils.cp File.join(utf8_root, file),
                   "ext/google/protobuf_c/third_party/utf8_range"
    end
  end
end

if RUBY_PLATFORM == "java"
  task :clean => :require_mvn do
    system("mvn --batch-mode clean")
  end

  task :compile => :require_mvn do
    system("mvn --batch-mode package")
  end

  task :require_mvn do
    raise ArgumentError, "maven needs to be installed" if `which mvn` == ''
  end

else
  Rake::ExtensionTask.new("protobuf_c", spec) do |ext|
    unless RUBY_PLATFORM =~ /darwin/
      # TODO: also set "no_native to true" for mac if possible. As is,
      # "no_native" can only be set if the RUBY_PLATFORM doing
      # cross-compilation is contained in the "ext.cross_platform" array.
      ext.no_native = true
    end
    ext.ext_dir = "ext/google/protobuf_c"
    ext.lib_dir = "lib/google"
    ext.cross_compile = true
    ext.cross_platform = [
      'x86-mingw32', 'x64-mingw32', 'x64-mingw-ucrt',
      'x86_64-linux', 'x86-linux',
      'x86_64-darwin', 'arm64-darwin',
    ]

    ext.cross_compiling do |gem_spec|
      # rake-compiler would call `spec.extensions.clear` which removes the `Rakefile` extension,
      # that `rake` doesn't need to be a runtime dependency for native gems.
      gem_spec.dependencies.delete_if { |dependency| dependency.name == 'rake' }
      gem_spec.add_development_dependency 'rake', '>= 13'
    end
  end

  task 'gem:java' do
    sh "rm Gemfile.lock"
    require 'rake_compiler_dock'
    # Specify the repo root as the working and mount directory to provide access
    # to the java directory
    repo_root = File.realdirpath File.join(Dir.pwd, '..')
    RakeCompilerDock.sh <<-"EOT", platform: 'jruby', rubyvm: :jruby, mountdir: repo_root, workdir: repo_root
      sudo apt-get install maven -y && \
      cd java && mvn install -Dmaven.test.skip=true && cd ../ruby && \
      bundle && \
      IN_DOCKER=true rake compile gem
    EOT
  end

  task 'gem:windows' do
    sh "rm Gemfile.lock"
    require 'rake_compiler_dock'
    ['x86-mingw32', 'x64-mingw32', 'x64-mingw-ucrt', 'x86_64-linux', 'x86-linux'].each do |plat|
      RakeCompilerDock.sh <<-"EOT", platform: plat
        bundle && \
        IN_DOCKER=true rake native:#{plat} pkg/#{spec.full_name}-#{plat}.gem RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0
      EOT
    end
  end

  if RUBY_PLATFORM =~ /darwin/
    task 'gem:native' do
      system "rake genproto"
      system "rake cross native gem RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0"
    end
  else
    task 'gem:native' => [:genproto, 'gem:windows', 'gem:java']
  end
end

task :genproto => genproto_output

task :clean do
  sh "rm -f #{genproto_output.join(' ')}"
  sh "rm -f google-protobuf-*gem"
  sh "rm -f Gemfile.lock"
  sh "rm -rf pkg"
  sh "rm -rf tmp"
  # Handles third_party and any platform specific directories built by FFI
  Pathname('ext/google/protobuf_c').children.select(&:directory?).each do |dir|
    sh "rm -rf #{dir}"
  end
end

Gem::PackageTask.new(spec) do |pkg|
end

# Skip build/genproto in Bazel builds, where we expect this to
# be done already.
Rake::TestTask.new(:test => ENV['BAZEL'] == 'true' ? [] : [:build, :genproto]) do |t|
  t.test_files = FileList["tests/*.rb"].exclude("tests/gc_test.rb", "tests/common_tests.rb")
end

# gc_test needs to be split out to ensure the generated file hasn't been
# imported by other tests.
Rake::TestTask.new(:gc_test => ENV['BAZEL'] == 'true' ? [] : :build) do |t|
  t.test_files = FileList["tests/gc_test.rb"]
end

task :build => [:clean, :genproto, :copy_third_party, :compile, :"ffi-protobuf:default"]
Rake::Task[:gem].enhance [:copy_third_party, :genproto]
task :default => [:build]

# vim:sw=2:et
