# typed: strict
# frozen_string_literal: true

require "utils/path"

module Language
  # Helper functions for PHP formulae.
  #
  # @api public
  module PHP
    # Helper module for replacing `php` shebangs.
    module Shebang
      extend T::Helpers

      requires_ancestor { Formula }

      module_function

      # A regex to match potential shebang permutations.
      PHP_SHEBANG_REGEX = %r{\A#! ?(?:/usr/bin/(?:env )?)?php( |$)}

      # The length of the longest shebang matching `SHEBANG_REGEX`.
      PHP_SHEBANG_MAX_LENGTH = T.let("#! /usr/bin/env php ".length, Integer)

      # @private
      sig { params(php_path: T.any(String, Pathname)).returns(Utils::Shebang::RewriteInfo) }
      def php_shebang_rewrite_info(php_path)
        Utils::Shebang::RewriteInfo.new(
          PHP_SHEBANG_REGEX,
          PHP_SHEBANG_MAX_LENGTH,
          "#{php_path}\\1",
        )
      end

      sig { params(formula: Formula).returns(Utils::Shebang::RewriteInfo) }
      def detected_php_shebang(formula = T.cast(self, Formula))
        php_deps = formula.deps.select(&:required?).map(&:name).grep(/^php(@.+)?$/)
        raise ShebangDetectionError.new("PHP", "formula does not depend on PHP") if php_deps.empty?
        raise ShebangDetectionError.new("PHP", "formula has multiple PHP dependencies") if php_deps.length > 1

        php_shebang_rewrite_info(Utils::Path.formula_opt_bin(php_deps.first)/"php")
      end
    end
  end
end
