# typed: strict

require 'braid/sorbet/setup'
require 'braid/version'

module Braid
  extend T::Sig

  OLD_CONFIG_FILE      = '.braids'
  CONFIG_FILE          = '.braids.json'

  # See the background in the "Supported environments" section of README.md.
  #
  # The newest Git feature that Braid is currently known to rely on is
  # `git ls-remote --symref`, which was added in Git 2.8.0 (in 2016).  It
  # doesn't seem worth even a small amount of work to remove that dependency and
  # support even older versions of Git.  So set that as the declared requirement
  # for now.  In general, a reasonable approach might be to try to support the
  # oldest version of Git in current "long-term support" versions of popular OS
  # distributions.
  REQUIRED_GIT_VERSION = '2.8.0'

  @verbose = T.let(false, T::Boolean)

  sig {returns(T::Boolean)}
  def self.verbose
    !!@verbose
  end

  sig {params(new_value: T::Boolean).void}
  def self.verbose=(new_value)
    @verbose = !!new_value
  end

  @force = T.let(false, T::Boolean)

  sig {returns(T::Boolean)}
  def self.force
    !!@force
  end

  sig {params(new_value: T::Boolean).void}
  def self.force=(new_value)
    @force = !!new_value
  end

  sig {returns(T::Boolean)}
  def self.use_local_cache
    [nil, 'true', '1'].include?(ENV['BRAID_USE_LOCAL_CACHE'])
  end

  sig {returns(String)}
  def self.local_cache_dir
    File.expand_path(ENV['BRAID_LOCAL_CACHE_DIR'] || "#{ENV['HOME']}/.braid/cache")
  end

  class BraidError < StandardError
    extend T::Sig
  end

  class InternalError < BraidError
    sig {returns(String)}
    def message
      "internal error: #{super}"
    end
  end
end

require 'braid/operations_lite'
require 'braid/operations'
require 'braid/mirror'
require 'braid/config'
require 'braid/command'
require 'braid/commands/add'
require 'braid/commands/diff'
require 'braid/commands/push'
require 'braid/commands/remove'
require 'braid/commands/setup'
require 'braid/commands/update'
require 'braid/commands/status'
require 'braid/commands/upgrade_config'
