require 'rake/clean'
require "bundler/gem_tasks"
require "pathname"
require "yaml"
require "rake/testtask"

extsources = YAML.load_file("extsources.yaml")
SOURCES = FileList[]
extsources.each do |src|
  basename = src.pathmap("%f")
  dest = basename == "LICENSE" ? basename : basename.pathmap("ext/%f")
  file src
  file dest => src do |t|
    cp t.source, t.name
  end
  SOURCES.include dest
end
CLEAN.include SOURCES
CLEAN.include FileList[
                "ext/*.o",
                "ext/*.metal",
                "ext/whisper.{so,bundle,dll}",
                "ext/depend"
              ]

task build: FileList[
       "ext/Makefile",
       "ext/ruby_whisper.h",
       "ext/ruby_whisper.cpp",
       "whispercpp.gemspec",
     ]

directory "pkg"
CLOBBER.include "pkg"

TEST_MODEL = "../../models/ggml-base.en.bin"
LIB_NAME = "whisper".ext(RbConfig::CONFIG["DLEXT"])
SO_FILE = File.join("ext", LIB_NAME)
LIB_FILE = File.join("lib", LIB_NAME)

file "ext/Makefile" => ["ext/extconf.rb", "ext/ruby_whisper.h", "ext/ruby_whisper.cpp"] + SOURCES do |t|
  Dir.chdir "ext" do
    ruby "extconf.rb"
  end
end

file SO_FILE => "ext/Makefile" do |t|
  Dir.chdir "ext" do
    sh "make"
  end
end
CLEAN.include LIB_FILE

directory "lib"
file LIB_FILE => [SO_FILE, "lib"] do |t|
  copy t.source, t.name
end

Rake::TestTask.new do |t|
  t.test_files = FileList["tests/test_*.rb"]
end
task test: [TEST_MODEL, LIB_FILE]

file TEST_MODEL do
  Dir.chdir "../.." do
    sh "./models/download-ggml-model.sh base.en"
  end
end
