namespace BasicCoding;

internal static class Variables
{
    internal static void DeclarationsAndAssignments()
    {
        string part1 = "ostateczne pytanie";
        string part2 = "o koniec czegoś";
        int theAnswer = 42;
        int andAnotherThing;

        part2 = " o koniec świata, wszechświata i ogólnie wszystkiego";
        andAnotherThing = 123;

// Aby zobaczyć błąd kompilatora z listingu 5., zmień to:
#if false
//  na to:
// #if true
        theAnswer = "Tego kompilator nie przepuści";
#endif

        double a = 1, b = 2.5, c = -3;

        // Zastosuj zmienne, by unikąć ostrzeżeń o nie używanych zmiennych
        Console.WriteLine($"Odpowiedzią na {part1} {part2} jest {theAnswer}, a nie {andAnotherThing}, czy też {a + b + c}");
    }

    internal static void ImplicitVariableTypes()
    {
        var part1 = "ostateczne pytanie";
        var part2 = "o koniec czegoś";
        var theAnswer = 40 + 2;

// Zastosuj zmienne, by unikąć ostrzeżeń o nie używanych zmiennych
        Console.WriteLine($"Odpowiedzią na {part1} {part2} jest {theAnswer}");
    }

// Aby zobaczyć błędny kompilatora z listingów 7, 10-15, zmień to:
#if false
//  na to:
// #if true
    internal static void SomeBadCode()
    {
        var theAnswer = 42;
        theAnswer = "Tego kompilator nie przepuści";

        int willNotWork;
        Console.WriteLine(willNotWork);
    }

    static void SomeMethod()
    {
        int thisWillNotWork = 42;
    }

    static void AnUncompilableMethod()
    {
        Console.WriteLine(thisWillNotWork);
    }

    internal static void NotInScope()
    {
        int someValue = GetValue();
        if (someValue > 100)
        {
            int willNotWork = someValue - 100;
        }
        Console.WriteLine(willNotWork);
    }

    public static void SurprisingNameCollision()
    {
        int someValue = GetValue();
        if (someValue > 100)
        {
            int anotherValue = someValue - 100;  // Błąd kompilatora
            Console.WriteLine(anotherValue);
        }

        int anotherValue = 123;
    }

    public static void HidingAVariable()
    {
        var r = new Random();
        bool problem1 = r.Next(0, 2) == 0;
        bool problem2 = r.Next(0, 2) == 0;
        bool problem3 = r.Next(0, 2) == 0;

        int errorCount = 0;
        if (problem1)
        {
            errorCount += 1;

            if (problem2)
            {
                errorCount += 1;
            }

            // Wyobraź sobie ten fragment w dużym programie, gdzie
            // pomiędzy nim a poniższymi wierszami jest bardo dużo innego kodu

            int errorCount = GetErrors();  // Błąd kompilatora
            if (problem3)
            {
                errorCount += 1;
            }
        }

        Console.WriteLine(errorCount);
    }
#endif

    internal static void UsingVariables()
    {
        string part1 = "ostateczne pytanie";
        string part2 = "o koniec czegoś";
        int theAnswer = 42;

        part2 = " o koniec świata, wszechświata i ogólnie wszystkiego";

        string questionText = "Jaka jest odpowiedź na " + part1 + " " + part2 + "?";
        string answerText = "Odpowiedzią na " + part1 + ", " +
                               part2 + ", jest: " + theAnswer;

        Console.WriteLine(questionText);
        Console.WriteLine(answerText);
    }

    internal static void UseVariableFromOuterScope()
    {
        int someValue = GetValue();
        if (someValue > 100)
        {
            Console.WriteLine(someValue);
        }
    }

    private static int GetValue() => 42;
}
