# typed: strict
# frozen_string_literal: true

require "abstract_command"
require "extend/ENV"
require "formula"

module Homebrew
  module DevCmd
    class Sh < AbstractCommand
      cmd_args do
        description <<~EOS
          Enter an interactive shell for Homebrew's build environment. Use years-battle-hardened
          build logic to help your `./configure && make && make install`
          and even your `gem install` succeed. Especially handy if you run Homebrew
          in an Xcode-only configuration since it adds tools like `make` to your `PATH`
          which build systems would not find otherwise.
        EOS
        flag   "--env=",
               description: "Use the standard `PATH` instead of superenv's when `std` is passed."
        flag   "-c=", "--cmd=",
               description: "Execute commands in a non-interactive shell."

        named_args :file, max: 1
      end

      sig { override.void }
      def run
        ENV.activate_extensions!(env: args.env)

        if superenv?(args.env)
          T.cast(ENV, Superenv).deps = Formula.installed.select { |f| f.keg_only? && f.opt_prefix.directory? }
        end
        ENV.setup_build_environment
        if superenv?(args.env)
          # superenv stopped adding brew's bin but generally users will want it
          ENV["PATH"] = PATH.new(ENV.fetch("PATH")).insert(1, HOMEBREW_PREFIX/"bin").to_s
        end

        ENV["VERBOSE"] = "1" if args.verbose?

        preferred_shell = Utils::Shell.preferred_path(default: "/bin/bash")

        if args.cmd.present?
          safe_system(preferred_shell, "-c", args.cmd)
        elsif args.named.present?
          safe_system(preferred_shell, args.named.first)
        else
          shell_type = Utils::Shell.preferred
          subshell = case shell_type
          when :zsh
            "PS1='brew %B%F{green}%~%f%b$ ' #{preferred_shell} -d -f"
          when :bash
            "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell} --noprofile --norc"
          else
            "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell}"
          end
          puts <<~EOS
            Your shell has been configured to use Homebrew's build environment;
            this should help you build stuff. Notably though, the system versions of
            gem and pip will ignore our configuration and insist on using the
            environment they were built under (mostly). Sadly, scons will also
            ignore our configuration.
            When done, type `exit`.
          EOS
          $stdout.flush
          safe_system subshell
        end
      end
    end
  end
end
