///|
/// MoonBit Text library test examples
/// Use inspect test to verify various text processing functions

///|
/// Test: String format conversion
test "string_conversion_tests" {
  let original = "hello_world_example"

  // Test various format conversions
  inspect(to_camel_case(original), content="helloWorldExample")
  inspect(to_kebab_case(original), content="hello-world-example")
  inspect(to_pascal_case(original), content="HelloWorldExample")
  inspect(to_snake_case(original), content="hello_world_example")

  // Test empty string
  inspect(to_camel_case(""), content="")
  inspect(to_kebab_case(""), content="")
  inspect(to_pascal_case(""), content="")
  inspect(to_snake_case(""), content="")

  // Test single word
  inspect(to_camel_case("hello"), content="hello")
  inspect(to_pascal_case("hello"), content="Hello")
}

///|
/// Test: Complex string conversion
test "complex_conversion_tests" {
  let complex = "XMLHttpRequest"

  // Test word splitting
  let words = split_to_words(complex)
  inspect(
    words,
    content=(
      #|["XML", "Http", "Request"]
    ),
  )

  // Test conversion results
  inspect(to_camel_case(complex), content="xmlHttpRequest")
  inspect(to_kebab_case(complex), content="xml-http-request")
  inspect(to_pascal_case(complex), content="XmlHttpRequest")
  inspect(to_snake_case(complex), content="xml_http_request")

  // Test other complex cases
  inspect(to_camel_case("API_Version_2"), content="apiVersion2")
  inspect(to_snake_case("getUserInfo"), content="get_user_info")
}

///|
/// Test: String distance calculation
test "string_distance_tests" {
  // Test basic distance calculation
  inspect(levenshtein_distance("hello", "hallo"), content="1")
  inspect(levenshtein_distance("kitten", "sitting"), content="3")
  inspect(levenshtein_distance("algorithm", "altruistic"), content="6")
  inspect(levenshtein_distance("", "abc"), content="3")
  inspect(levenshtein_distance("same", "same"), content="0")

  // Test edge cases
  inspect(levenshtein_distance("", ""), content="0")
  inspect(levenshtein_distance("a", ""), content="1")
  inspect(levenshtein_distance("", "b"), content="1")
  inspect(levenshtein_distance("a", "a"), content="0")
  inspect(levenshtein_distance("a", "b"), content="1")
}

///|
/// Test: Similarity comparison and sorting
test "similarity_sorting_tests" {
  let words = ["help", "hello", "world", "test", "hi", "heap", "heart"]
  let target = "hep"
  let sorted = sort_by_similarity(words, target, None)

  // Verify sorting results (most similar should be first)
  inspect(sorted[0], content="help") // distance is 1
  inspect(sorted[1], content="heap") // distance is 2

  // Verify complete sorting (possible order)
  inspect(sorted.length(), content="7")

  // Test empty array
  let empty_words : Array[String] = []
  let empty_sorted = sort_by_similarity(empty_words, target, None)
  inspect(
    empty_sorted,
    content=(
      #|[]
    ),
  )
}

///|
/// Test: Closest string search
test "closest_string_tests" {
  let candidates = ["length", "size", "width", "height", "help", "depth"]

  // Test single closest string search
  inspect(closest_string_simple("hep", candidates), content="help")
  inspect(closest_string_simple("len", candidates), content="length")
  inspect(closest_string_simple("siz", candidates), content="size")
  inspect(closest_string_simple("heigh", candidates), content="height")

  // Test searching for multiple closest strings
  let query = "hep"
  let top3 = closest_strings(query, candidates, 3, None)
  inspect(top3[0], content="help")
  inspect(top3.length(), content="3")

  // Test case insensitive
  let mixed_case = ["Help", "HELLO", "world"]
  inspect(closest_string_simple("help", mixed_case), content="Help")

  // Test case sensitive option
  let opts = case_sensitive_closest_string_options()
  let case_sensitive_result = closest_string("Help", mixed_case, Some(opts))
  inspect(case_sensitive_result, content="Help")
}

///|
/// Test: Real world usage scenarios
test "real_world_usage_tests" {
  // 1. API naming conversion test
  let api_functions = ["getUserProfile", "createNewPost", "deleteOldFiles"]
  inspect(to_snake_case(api_functions[0]), content="get_user_profile")
  inspect(to_kebab_case(api_functions[0]), content="get-user-profile")
  inspect(to_snake_case(api_functions[1]), content="create_new_post")
  inspect(to_kebab_case(api_functions[1]), content="create-new-post")
  inspect(to_snake_case(api_functions[2]), content="delete_old_files")
  inspect(to_kebab_case(api_functions[2]), content="delete-old-files")

  // 2. Configuration field conversion test
  let config_fields = ["database_url", "max_connections", "timeout_seconds"]
  inspect(to_camel_case(config_fields[0]), content="databaseUrl")
  inspect(to_pascal_case(config_fields[0]), content="DatabaseUrl")
  inspect(to_camel_case(config_fields[1]), content="maxConnections")
  inspect(to_pascal_case(config_fields[1]), content="MaxConnections")
  inspect(to_camel_case(config_fields[2]), content="timeoutSeconds")
  inspect(to_pascal_case(config_fields[2]), content="TimeoutSeconds")

  // 3. File name similarity matching (typo correction) test
  let files = ["index.html", "main.css", "app.js", "readme.txt", "config.json"]
  let typos = ["inde.html", "main.cs", "ap.js", "readm.txt"]
  inspect(closest_string_simple(typos[0], files), content="index.html")
  inspect(closest_string_simple(typos[1], files), content="main.css")
  inspect(closest_string_simple(typos[2], files), content="app.js")
  inspect(closest_string_simple(typos[3], files), content="readme.txt")
}

///|
/// Test: Edge cases and error handling
test "edge_cases_and_error_handling" {
  // Test empty string input
  inspect(to_camel_case("   "), content="")
  inspect(to_snake_case("   "), content="")

  // Test single character
  inspect(to_camel_case("a"), content="a")
  inspect(to_pascal_case("a"), content="A")
  inspect(to_kebab_case("A"), content="a")

  // Test numbers and special characters
  inspect(to_camel_case("test123code"), content="test123Code")
  inspect(to_snake_case("test-123-code"), content="test_123_code")

  // Test strings already in target format
  inspect(to_camel_case("alreadyCamelCase"), content="alreadyCamelCase")
  inspect(to_snake_case("already_snake_case"), content="already_snake_case")
  inspect(to_kebab_case("already-kebab-case"), content="already-kebab-case")
  inspect(to_pascal_case("AlreadyPascalCase"), content="AlreadyPascalCase")
}

///|
/// Test: Performance-related edge cases
test "performance_edge_cases" {
  // Test long string
  let long_string = "this_is_a_very_long_string_with_many_words_to_test_performance"
  inspect(
    to_camel_case(long_string),
    content="thisIsAVeryLongStringWithManyWordsToTestPerformance",
  )

  // Test repeated patterns
  let repeated = "test_test_test"
  inspect(to_camel_case(repeated), content="testTestTest")
  inspect(to_pascal_case(repeated), content="TestTestTest")

  // Test distance of same-length strings
  inspect(levenshtein_distance("abcd", "efgh"), content="4")
  inspect(levenshtein_distance("abcd", "abcd"), content="0")
  inspect(levenshtein_distance("abcd", "abce"), content="1")
}