require 'rbconfig'

$: << File.expand_path(File.join(File.dirname(__FILE__), "../lib"))
require "mini_portile2"

recipes = []

def windows?
  RbConfig::CONFIG['target_os'] =~ /mswin|mingw32/
end

# libiconv
libiconv = MiniPortile.new "libiconv", "1.15"
libiconv.files << "ftp://ftp.gnu.org/pub/gnu/#{libiconv.name}/#{libiconv.name}-#{libiconv.version}.tar.gz"

recipes.push libiconv


# sqlite3
unless windows?
  # i can't get this version to build on Github Actions windows-latest / windows-2019
  sqlite3 = MiniPortile.new "sqlite3", "3.35.4"
  sqlite3.files << "https://www.sqlite.org/2021/sqlite-autoconf-3350400.tar.gz"

  recipes.push sqlite3
end


unless windows?
  # i can't get this version to build on Github Actions windows-latest / windows-2019
  # c-ares
  c_ares = MiniPortile.new "c-ares", "1.7.5"
  c_ares.files << {
    url: "file://#{File.dirname(__FILE__)}/c-ares-1.7.5.tar.gz",
    md5: "800875fc23cd8e1924d8af9172ed33e7"
  }

  recipes.push c_ares
end


# zlib
class ZlibRecipe < MiniPortile
  def windows?
    !(host =~ /mswin|mingw/).nil?
  end

  def configure
    return super unless windows?

    Dir.chdir work_path do
      mk = File.read 'win32/Makefile.gcc'
      File.open 'win32/Makefile.gcc', 'wb' do |f|
        f.puts "BINARY_PATH = #{path}/bin"
        f.puts "LIBRARY_PATH = #{path}/lib"
        f.puts "INCLUDE_PATH = #{path}/include"

        cross_build? and
          mk.sub!(/^PREFIX\s*=\s*$/, "PREFIX = #{host}-")

        f.puts mk
      end
    end
  end

  def configure_defaults
    ["--static"]
  end

  def configured?
    return super unless windows?

    !!(File.read(File.join(work_path, 'win32/Makefile.gcc')) =~ /^BINARY_PATH/)
  end

  def compile
    return super unless windows?

    execute "compile", "make -f win32/Makefile.gcc"
  end

  def install
    return if installed?
    return super unless windows?

    execute "install", %Q(#{make_cmd} -f win32/Makefile.gcc install)
  end

  def cross_build?
    host != original_host
  end
end

zlib = ZlibRecipe.new "zlib", "1.2.8"
zlib.files << {
  # url: "http://zlib.net/#{zlib.name}-#{zlib.version}.tar.gz",
  url: "file://#{File.dirname(__FILE__)}/#{zlib.name}-#{zlib.version}.tar.gz",
  md5: "44d667c142d7cda120332623eab69f40",
}

recipes.push zlib


namespace :ports do
  directory "ports"

  task :before do
    FileUtils.rm_rf(File.expand_path("tmp"), verbose: true);
    recipes.each do |recipe|
      FileUtils.rm_rf(recipe.path, verbose: true)
    end
  end
  task :all => :before

  recipes.each do |recipe|
    desc "Install port #{recipe.name} #{recipe.version}"
    task recipe.name => ["ports"] do |t|
      recipe.cook
      recipe.activate
    end

    task :all => recipe.name
  end

  desc "Install all ports and display installation location"
  task :all do
    recipes.each do |recipe|
      puts "Artifacts of '#{recipe.name}' in '#{recipe.path}'"
    end
    puts "LDFLAGS: " + ENV['LDFLAGS'].inspect
  end
end


desc "Adjust all recipes host for cross-compilation"
task :cross do
  recipes.each do |recipe|
    recipe.host = "i686-w64-mingw32"
  end
end
