# typed: strong
# frozen_string_literal: true

module Ffprober
  module Ffmpeg
    class Finder
      extend T::Sig
      SEARCH_PATHS = T.let(ENV['PATH'], T.nilable(String))

      sig { returns(String) }
      attr_reader :executable_name

      sig { void }
      def initialize
        @executable_path = T.let(nil, T.nilable(String))
        @executable_name = T.let(executable_name_picker, String)
        @path = T.let(nil, T.nilable(String))
      end

      sig { returns(String) }
      def path
        raise Ffprober::NoFfprobeFound, 'ffprobe executable not found' if executable_path.nil?

        @path ||= File.expand_path(executable_name, executable_path)
      end

      sig { returns(T::Boolean) }
      def windows?
        !(RUBY_PLATFORM =~ /(mingw|mswin)/).nil?
      end

      sig { returns(String) }
      def executable_name_picker
        if windows?
          T.let('ffprobe.exe', String)
        else
          T.let('ffprobe', String)
        end
      end

      sig { returns(T.nilable(String)) }
      def executable_path
        @executable_path ||= begin
          T.must(SEARCH_PATHS).split(File::PATH_SEPARATOR).detect do |path_to_check|
            File.executable?(File.join(path_to_check, executable_name))
          end
        end
      end
    end
  end
end
