/*
VariableDeclarationUsageDistance
allowedDistance = 1
ignoreVariablePattern = (default)
validateBetweenScopes = true
ignoreFinal = false


*/

//non-compiled with javac: Compilable with Java14
package com.puppycrawl.tools.checkstyle.checks.coding.variabledeclarationusagedistance;

public class InputVariableDeclarationUsageDistanceCheckSwitchExpressions {


    int howMany1(int k) {
        return switch (k) {
            case 1: {
                int c = 0;
                int a = 3;
                int b = 2;
                {
                    a = a + b;
                    c = b;
                }
                {
                    c--;
                }
                a = 7;
                yield 2;
            }

            case 2: {
                int arg = 9; // violation 'Distance .* is 2.'
                int d = 0;
                for (int i = 0; i < 10; i++) {
                    d++;
                    if (i > 5) {
                        d += arg;
                    }
                }

                String ar[] = {"1", "2"};
                for (String st : ar) {
                    System.identityHashCode(st);
                }
                yield 4;

            }

            case 3: {
                int blockNumWithSimilarVar = 3;
                int dist = 0;
                int index = 0;
                int block = 0;

                if (blockNumWithSimilarVar <= 1) {
                    do {
                        dist++;
                        if (block > 4) {
                            break;
                        }
                        index++;
                        block++;
                    } while (index < 7);
                } else {
                    while (index < 8) {
                        dist += block;
                        index++;
                        block++;
                    }
                }
                yield 56;

            }
            default: {
                int b = 0;
                int c = 0;
                int m = 0; // violation 'Distance between .* declaration and its first usage is 3.'
                int n = 0; // violation 'Distance between .* declaration and its first usage is 2.'
                {
                    c++;
                    b++;
                }
                {
                    n++;
                    m++;
                    b++;
                }
                yield k;
            }
        };
    }

    int howMany2(int k) {
        return switch (k) {
            case 1 -> {
                int c = 0;
                int a = 3;
                int b = 2;
                {
                    a = a + b;
                    c = b;
                }
                {
                    c--;
                }
                a = 7;
                yield 2;
            }
            case 2 -> {
                int arg = 9; // violation 'Distance .* is 2.'
                int d = 0;
                for (int i = 0; i < 10; i++) {
                    d++;
                    if (i > 5) {
                        d += arg;
                    }
                }

                String ar[] = {"1", "2"};
                for (String st : ar) {
                    System.identityHashCode(st);
                }
                yield 3;
            }
            case 3 -> {
                int blockNumWithSimilarVar = 3;
                int dist = 0;
                int index = 0;
                int block = 0;

                if (blockNumWithSimilarVar <= 1) {
                    do {
                        dist++;
                        if (block > 4) {
                            break;
                        }
                        index++;
                        block++;
                    } while (index < 7);
                } else {
                    while (index < 8) {
                        dist += block;
                        index++;
                        block++;
                    }
                }
                yield 4;
            }
            default -> {
                int b = 0;
                int c = 0;
                int m = 0; // violation 'Distance between .* declaration and its first usage is 3.'
                int n = 0; // violation 'Distance between .* declaration and its first usage is 2.'
                {
                    c++;
                    b++;
                }
                {
                    n++;
                    m++;
                    b++;
                }
                yield k;
            }
        };
    }

    public boolean equals1(Object obj) {
        int i = 1;
        int a = 5;
        int b = 6;
        switch (i) {
            case 1:
                int count; // violation 'Distance between .* declaration and its first usage is 3.'
                a = a + b;
                b = a + a;
                count = b;
                break;
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
        }
        return false;
    }

    public boolean equals2(Object obj) {
        int i = 1;
        int a = 5;
        int b = 6;
        switch (i) {
            case 1 -> {
                int count; // violation 'Distance between .* declaration and its first usage is 3.'
                a = a + b;
                b = a + a;
                count = b;
            }
        }
        return false;
    }
}


