class Dependabot::Uv::FileUpdater

def self.updated_files_regex

def self.updated_files_regex
  [
    /^.*\.txt$/,               # Match any .txt files (e.g., requirements.txt) at any level
    /^.*\.in$/,                # Match any .in files at any level
    /^.*pyproject\.toml$/,     # Match pyproject.toml at any level
    /^.*uv\.lock$/             # Match uv.lock at any level
  ]
end

def check_required_files

def check_required_files
  filenames = dependency_files.map(&:name)
  return if filenames.any? { |name| name.end_with?(".txt", ".in") }
  return if pyproject
  raise "Missing required files!"
end

def pip_compile_files

def pip_compile_files
  @pip_compile_files ||= T.let(
    dependency_files.select { |f| f.name.end_with?(".in") },
    T.nilable(T::Array[DependencyFile])
  )
end

def pip_compile_index_urls

def pip_compile_index_urls
  if credentials.any?(&:replaces_base?)
    credentials.select(&:replaces_base?).map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
  else
    urls = credentials.map { |cred| AuthedUrlBuilder.authed_url(credential: cred) }
    # If there are no credentials that replace the base, we need to
    # ensure that the base URL is included in the list of extra-index-urls.
    [nil, *urls]
  end
end

def pyproject

def pyproject
  @pyproject ||= T.let(get_original_file("pyproject.toml"), T.nilable(Dependabot::DependencyFile))
end

def subdependency_resolver

def subdependency_resolver
  raise "Claimed to be a sub-dependency, but no lockfile exists!" if pip_compile_files.empty?
  :pip_compile if pip_compile_files.any?
end

def updated_dependency_files

def updated_dependency_files
  updated_files = updated_pip_compile_based_files
  updated_files += updated_uv_lock_files
  if updated_files.none? ||
     updated_files.sort_by(&:name) == dependency_files.sort_by(&:name)
    raise "No files have changed!"
  end
  updated_files
end

def updated_pip_compile_based_files

def updated_pip_compile_based_files
  CompileFileUpdater.new(
    dependencies: dependencies,
    dependency_files: dependency_files,
    credentials: credentials,
    index_urls: pip_compile_index_urls
  ).updated_dependency_files
end

def updated_requirement_based_files

def updated_requirement_based_files
  RequirementFileUpdater.new(
    dependencies: dependencies,
    dependency_files: dependency_files,
    credentials: credentials,
    index_urls: pip_compile_index_urls
  ).updated_dependency_files
end

def updated_uv_lock_files

def updated_uv_lock_files
  LockFileUpdater.new(
    dependencies: dependencies,
    dependency_files: dependency_files,
    credentials: credentials,
    index_urls: pip_compile_index_urls
  ).updated_dependency_files
end