Fix formatting for `if` clauses in `match-case` blocks
diff --git a/CHANGES.md b/CHANGES.md
index e28730a3b5f..fe234380799 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -16,6 +16,9 @@
 
 <!-- Changes that affect Black's preview style -->
 
+- `if` guards in `case` blocks are now wrapped in parentheses when the line is too long.
+  (#4269)
+
 ### Configuration
 
 <!-- Changes to how Black can be configured -->
diff --git a/docs/the_black_code_style/future_style.md b/docs/the_black_code_style/future_style.md
index 4ae46cecded..e0f45b47106 100644
--- a/docs/the_black_code_style/future_style.md
+++ b/docs/the_black_code_style/future_style.md
@@ -34,6 +34,8 @@ Currently, the following features are included in the preview style:
   quotes of a docstring
 - `remove_redundant_guard_parens`: Removes redundant parentheses in `if` guards for
   `case` blocks.
+- `parens_for_long_if_clauses_in_case_block`: Adds parentheses to `if` clauses in `case`
+  blocks when the the line is too long
 
 (labels/unstable-features)=
 
diff --git a/src/black/linegen.py b/src/black/linegen.py
index e34ff040c73..2d9c27a6141 100644
--- a/src/black/linegen.py
+++ b/src/black/linegen.py
@@ -1310,6 +1310,16 @@ def normalize_invisible_parens(  # noqa: C901
                 child, parens_after={"case"}, mode=mode, features=features
             )
 
+        # Add parentheses around if guards in case blocks
+        if (
+            isinstance(child, Node)
+            and child.type == syms.guard
+            and Preview.parens_for_long_if_clauses_in_case_block in mode
+        ):
+            normalize_invisible_parens(
+                child, parens_after={"if"}, mode=mode, features=features
+            )
+
         # Add parentheses around long tuple unpacking in assignments.
         if (
             index == 0
diff --git a/src/black/mode.py b/src/black/mode.py
index 90c10c324a5..b54f355e20a 100644
--- a/src/black/mode.py
+++ b/src/black/mode.py
@@ -180,6 +180,7 @@ class Preview(Enum):
     is_simple_lookup_for_doublestar_expression = auto()
     docstring_check_for_newline = auto()
     remove_redundant_guard_parens = auto()
+    parens_for_long_if_clauses_in_case_block = auto()
 
 
 UNSTABLE_FEATURES: Set[Preview] = {
diff --git a/src/black/resources/black.schema.json b/src/black/resources/black.schema.json
index 8252a6c4bd8..5c800775d57 100644
--- a/src/black/resources/black.schema.json
+++ b/src/black/resources/black.schema.json
@@ -88,7 +88,8 @@
           "typed_params_trailing_comma",
           "is_simple_lookup_for_doublestar_expression",
           "docstring_check_for_newline",
-          "remove_redundant_guard_parens"
+          "remove_redundant_guard_parens",
+          "parens_for_long_if_clauses_in_case_block"
         ]
       },
       "description": "Enable specific features included in the `--unstable` style. Requires `--preview`. No compatibility guarantees are provided on the behavior or existence of any unstable features."
diff --git a/tests/data/cases/pattern_matching_complex.py b/tests/data/cases/pattern_matching_complex.py
index ba64f2639a0..028832d772a 100644
--- a/tests/data/cases/pattern_matching_complex.py
+++ b/tests/data/cases/pattern_matching_complex.py
@@ -83,7 +83,7 @@
 match x:
     case [0]:
         y = 0
-    case [1, 0] if (x := x[:0]):
+    case [1, 0] if x := x[:0]:
         y = 1
     case [1, 0]:
         y = 2
diff --git a/tests/data/cases/pattern_matching_with_if_stmt.py b/tests/data/cases/pattern_matching_with_if_stmt.py
new file mode 100644
index 00000000000..ff54af91771
--- /dev/null
+++ b/tests/data/cases/pattern_matching_with_if_stmt.py
@@ -0,0 +1,72 @@
+# flags: --preview --minimum-version=3.10
+match match:
+    case "test" if case != "not very loooooooooooooog condition":  # comment
+        pass
+
+match smth:
+    case "test" if "any long condition" != "another long condition" and "this is a long condition":
+        pass
+    case test if "any long condition" != "another long condition" and "this is a looooong condition":
+        pass
+    case test if "any long condition" != "another long condition" and "this is a looooong condition":  # some additional comments
+        pass
+    case test if (True): # some comment
+        pass
+    case test if (False
+        ): # some comment
+        pass
+    case test if (True  # some comment
+        ):
+        pass  # some comment
+    case cases if (True  # some comment
+                   ): # some other comment
+        pass  # some comment
+    case match if (True  # some comment
+                   ):
+        pass  # some comment
+
+# case black_test_patma_052 (originally in the pattern_matching_complex test case)
+match x:
+    case [1, 0] if x := x[:0]:
+        y = 1
+    case [1, 0] if (x := x[:0]):
+        y = 1
+
+# output
+
+match match:
+    case "test" if case != "not very loooooooooooooog condition":  # comment
+        pass
+
+match smth:
+    case "test" if (
+        "any long condition" != "another long condition" and "this is a long condition"
+    ):
+        pass
+    case test if (
+        "any long condition" != "another long condition"
+        and "this is a looooong condition"
+    ):
+        pass
+    case test if (
+        "any long condition" != "another long condition"
+        and "this is a looooong condition"
+    ):  # some additional comments
+        pass
+    case test if True:  # some comment
+        pass
+    case test if False:  # some comment
+        pass
+    case test if True:  # some comment
+        pass  # some comment
+    case cases if True:  # some comment  # some other comment
+        pass  # some comment
+    case match if True:  # some comment
+        pass  # some comment
+
+# case black_test_patma_052 (originally in the pattern_matching_complex test case)
+match x:
+    case [1, 0] if x := x[:0]:
+        y = 1
+    case [1, 0] if x := x[:0]:
+        y = 1

<!-- Hello! Thanks for submitting a PR. To help make things go a bit more
     smoothly we would appreciate that you go through this template. -->

### Description

Fixes #3793.

Now the `if` clauses in the `case-match` blocks will be correctly wrapped with parenthesis. 

The previous problem of having redundant parentheses being added to `case` statement when it's accompanied by an `if` clause that was too long, like the example mentioned in #3793 discussion, is also resolved.



### Checklist - did you ...

- [x] Add an entry in `CHANGES.md` if necessary?
- [x] Add / update tests if necessary?
- [ ] Add new / update outdated documentation?