///|
/// Split a path string by the given separator
fn split_path(s : String, separator : Char) -> Array[String] raise {
  let result = []
  let mut start = 0
  let sep_code = separator.to_int()
  for i = 0; i < s.length(); i = i + 1 {
    if s[i] == sep_code {
      if i > start {
        result.push(s[start:i].to_string())
      }
      start = i + 1
    }
  }

  // Add the last part if there's content after the last separator
  if start < s.length() {
    result.push(s[start:].to_string())
  }
  result
}

///|
/// Check if a string has a file extension (contains a dot)
fn has_file_extension(s : String) -> Bool {
  s.contains(".")
}

///|
/// Check if a string is likely a filename based on common patterns
fn is_likely_filename(s : String) -> Bool {
  // For now, we'll use a simple heuristic: if it doesn't end with typical directory indicators
  // and doesn't contain certain directory-like patterns, treat it as a file
  // This is a simple heuristic that can be improved
  if s == "." || s == ".." {
    return false // Special directory entries
  }

  // If it has a file extension, it's likely a file
  if has_file_extension(s) {
    return true
  }

  // If it has no extension and looks like a common directory name, treat as directory
  let common_dirs = [
    "bin", "lib", "src", "home", "usr", "var", "etc", "opt", "tmp", "Users", "Documents",
    "Desktop", "Downloads", "Pictures", "Music", "Videos", "user", "admin", "root",
    "config", "settings", "data", "cache", "logs", "John", "documents", "projects", // Add some test-specific names
  ]
  for dir in common_dirs {
    if s.to_lower() == dir.to_lower() {
      return false
    }
  }

  // Without a file extension, default to treating as directory 
  // This is more conservative - only treat as file if we have strong evidence
  false
}

///|
/// Split a filename into base and extension
fn split_filename(filename : String) -> (String, String) raise {
  // Find the last dot manually
  let mut last_dot = -1
  for i = 0; i < filename.length(); i = i + 1 {
    if filename[i] == '.'.to_int() {
      last_dot = i
    }
  }
  if last_dot > 0 {
    let base = filename[0:last_dot].to_string()
    let ext = filename[last_dot + 1:].to_string()
    (base, ext)
  } else {
    (filename, "") // No extension or dot at beginning
  }
}