#include <iostream>
#include <cstdlib> // for rand() and srand()
#include <ctime>   // for time()
#include <stdio.h> // for printf and scanf
using namespace std;

int sum(int x, int y) {
    return x + y;
}

void welcomeText() {
    cout << "### Welcome to the guessing number game ###" << endl;
}

void puts(string str) {
    cout << str << endl;
}

int getGuessNumber() {
    int guess;
    cout << "Guess number (1 to 10): ";
    cin >> guess;
    return guess;
}

int main() {
    // Login system
    string username;
    cout << "Username: ";
    cin >> username;

    string passwd;
    string p1 = "13022567"; 
    int attempts = 0;
    const int max_attempts = 4;

    cout << "Enter Password: ";
    while (attempts < max_attempts) {
        cin >> passwd;

        if (passwd == p1) {
            break;
        } else {
            attempts++;
            cout << "Incorrect password attempt " << attempts << endl;

            if (attempts >= max_attempts) {
                cout << "Too many failed attempts. Exiting program." << endl;
                exit(0);
            }
        }
    }

    // Calculator menu
    int choice;
    int num1, num2;

    cout << "\nMain Menu\n";
    cout << "1. +\n";
    cout << "2. -\n";
    cout << "3. x\n";
    cout << "4. /\n";

    while (true) {
        cout << "\n--------------------------------\n";
        cout << "Select choice ==> ";
        cin >> choice;

        if (choice == 5) {
            break; 
        }

        if (choice < 1 || choice > 4) {
            cout << "Invalid choice! Please select a valid number between 1 and 4.\n";
            continue; 
        }

        cout << "Input Number 1 [1-10]: ";
        cin >> num1;
        while (num1 < 1 || num1 > 10) {
            cout << "Error: Please enter a number between 1 and 10.\n";
            cout << "Input Number 1 [1-10]: ";
            cin >> num1;
        }

        cout << "Input Number 2 [1-10]: ";
        cin >> num2;
        while (num2 < 1 || num2 > 10) {
            cout << "Error: Please enter a number between 1 and 10.\n";
            cout << "Input Number 2 [1-10]: ";
            cin >> num2;
        }

        cout << "\n--------------------------------\n";
        bool swapped = false;
        if (num1 < num2) {
            swapped = true;
        }

        switch (choice) {
            case 1: 
                if (swapped) {
                    cout << num2 << " + " << num1 << " = " << (num2 + num1) << endl;
                } else {
                    cout << num1 << " + " << num2 << " = " << (num1 + num2) << endl;
                }
                break;
            case 2:  
                if (swapped) {
                    cout << num2 << " - " << num1 << " = " << (num2 - num1) << endl;
                } else {
                    cout << num1 << " - " << num2 << " = " << (num1 - num2) << endl;
                }
                break;
            case 3:  
                if (swapped) {
                    cout << num2 << " * " << num1 << " = " << (num2 * num1) << endl;
                } else {
                    cout << num1 << " * " << num2 << " = " << (num1 * num2) << endl;
                }
                break;
            case 4:  
                if (num2 == 0) {
                    cout << "Error: Division by zero is not allowed.\n";
                } else if (swapped) {
                    cout << num2 << " / " << num1 << " = " << (num2 / num1) << endl;
                } else {
                    cout << num1 << " / " << num2 << " = " << (num1 / num2) << endl;
                }
                break;
        }
        
        char continueChoice;
        cout << "\nDo you want to continue with another calculation? (y/n): ";
        cin >> continueChoice;
        
        if (continueChoice != 'y' && continueChoice != 'Y') {
            break; 
        }
    }

    // Sum calculation
    int a = 3;
    int b = 5;
    cout << "a + b = " << sum(a, b) << endl;

    // Guessing number game
    srand(time(NULL));
    bool is_gameover = false;
    int guess, secret;
    int guessed = 0;
    
    welcomeText();
    secret = rand() % 10 + 1;
    puts("Secret number has been chosen");

    do {
        guess = getGuessNumber();
        guessed++;
        if (secret < guess) {
            puts("The secret number is lower");
        } else if (secret > guess) {
            puts("The secret number is higher");
        }
    } while (secret != guess);

    puts("Congratulations!");
    cout << "The secret number is " << secret << endl;
    cout << "You made " << guessed << " guess" << (guessed != 1 ? "es" : "") << endl;

    // Grade calculator
    string name;
    int score1, score2, score3, total;

    cout << "Grade Calculator\n";
    cout << "Name: ";
    cin >> name;

    cout << "Score 1: ";
    cin >> score1;

    cout << "Score 2: ";
    cin >> score2;

    cout << "Score 3: ";
    cin >> score3;

    cout << "======================\n";
    total = score1 + score2 + score3;
    cout << "Total: " << total << endl;
    cout << "======================\n";

    switch (total / 10) {
        case 10:
        case 9:
        case 8:
            cout << "Grade A" << endl;
            break;
        case 7:
            cout << "Grade B" << endl;
            break;
        case 6:
            cout << "Grade C" << endl;
            break;
        case 5:
            cout << "Grade D" << endl;
            break;
        default:
            cout << "Grade E" << endl;
            break;
    }

    // Multiplication Table
    int number;
    cout << "Enter number for multiplication table: ";
    cin >> number;
    
    for (int i = 1; i <= 24; i++) {
        printf(" +-------------+----------------+\n");
        printf(" | %4d x %2d   |%10d      |\n", number, i, number * i);
        
        if (i == 24) {
            printf(" +-------------+----------------+\n");
        }
    }

    return 0;
}
