class Steep::CLI

def self.available_commands

def self.available_commands
  [:check, :validate, :annotations, :scaffold, :interface]
end

def initialize(stdout:, stdin:, stderr:, argv:)

def initialize(stdout:, stdin:, stderr:, argv:)
  @stdout = stdout
  @stdin = stdin
  @stderr = stderr
  @argv = argv
end

def process_annotations

def process_annotations
  source_paths = argv.map {|file| Pathname(file) }
  Drivers::Annotations.new(source_paths: source_paths, stdout: stdout, stderr: stderr).run
end

def process_check

def process_check
  signature_dirs = []
  verbose = false
  no_builtin = false
  dump_all_types = false
  fallback_any_is_error = false
  strict = false
  OptionParser.new do |opts|
    opts.on("-I [PATH]") {|path| signature_dirs << Pathname(path) }
    opts.on("--no-builtin") { no_builtin = true }
    opts.on("--verbose") { verbose = true }
    opts.on("--dump-all-types") { dump_all_types = true }
    opts.on("--strict") { strict = true }
    opts.on("--fallback-any-is-error") { fallback_any_is_error = true }
  end.parse!(argv)
  if signature_dirs.empty?
    signature_dirs << Pathname("sig")
  end
  unless no_builtin
    signature_dirs.unshift Pathname(__dir__).join("../../stdlib").realpath
  end
  source_paths = argv.map {|path| Pathname(path) }
  if source_paths.empty?
    source_paths << Pathname(".")
  end
  Drivers::Check.new(source_paths: source_paths, signature_dirs: signature_dirs, stdout: stdout, stderr: stderr).tap do |check|
    check.verbose = verbose
    check.dump_all_types = dump_all_types
    check.fallback_any_is_error = fallback_any_is_error || strict
  end.run
end

def process_interface

def process_interface
  signature_dirs = []
  no_builtin = false
  OptionParser.new do |opts|
    opts.on("-I [PATH]") {|path| signature_dirs << Pathname(path) }
    opts.on("--no-builtin") { no_builtin = true }
  end
  unless no_builtin
    signature_dirs.unshift Pathname(__dir__).join("../../stdlib").realpath
  end
  Drivers::PrintInterface.new(type_name: argv.first, signature_dirs: signature_dirs, stdout: stdout, stderr: stderr).run
end

def process_scaffold

def process_scaffold
  source_paths = argv.map {|file| Pathname(file) }
  Drivers::Scaffold.new(source_paths: source_paths, stdout: stdout, stderr: stderr).run
end

def process_validate

def process_validate
  verbose = false
  no_builtin = false
  OptionParser.new do |opts|
    opts.on("--verbose") { verbose = true }
    opts.on("--no-builtin") { no_builtin = true }
  end.parse!(argv)
  signature_dirs = argv.map {|path| Pathname(path) }
  if signature_dirs.empty?
    signature_dirs << Pathname(".")
  end
  unless no_builtin
    signature_dirs.unshift Pathname(__dir__).join("../../stdlib").realpath
  end
  Drivers::Validate.new(signature_dirs: signature_dirs, stdout: stdout, stderr: stderr).tap do |validate|
    validate.verbose = verbose
  end.run
end

def run

def run
  setup_global_options or return 1
  setup_command or return 1
  __send__(:"process_#{command}")
end

def setup_command

def setup_command
  @command = argv.shift&.to_sym
  if CLI.available_commands.include?(@command)
    true
  else
    stderr.puts "Unknown command: #{command}"
    stderr.puts "  available commands: #{CLI.available_commands.join(', ')}"
    false
  end
end

def setup_global_options

def setup_global_options
  true
end