#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <windows.h>
using namespace std;

class User {
public:
    string name, password;
};

class FinancialRecord {
public:
    string id, date, description;
    double profit, loss;

    // Constructor
    FinancialRecord(string id, string date, string description, double profit, double loss) : id(id), date(date), description(description), profit(profit), loss(loss) {}
};


vector<string> split(string str, char delimiter) {
    vector<string> result;
    stringstream ss(str);
    string item;
    while (getline(ss, item, delimiter)) {
        result.push_back(item);
    }
    return result;
}

void register_user(vector<User>& users) {
    cout << "\nRegistering a new user\n";
    string name, password;
    cout << "Enter new user name: ";
    cin >> name;
    cout << "Enter new user password: ";
    cin >> password;
    User user;
    user.name = name;
    user.password = password;
    users.push_back(user);
    cout << "\nNew user has been registered successfully.";
}

bool login_user(const vector<User>& users, string& username, string& password) {
    cout << "\nLogging in...\n";
    cout << "Enter username: ";
    cin >> username;
    cout << "Enter password: ";
    cin >> password;
    for (const auto& user : users) {
        if (user.name == username && user.password == password) {
            cout << "\nLogin successful!";
            return true;
        }
    }
    cout << "\nInvalid username or password.";
    return false;
}

void display_additional_menu() {
    cout << "\nAdditional Menu:\n";
    cout << "1. Add Record\n";
    cout << "2. Edit User\n";
    cout << "3. Delete User\n";
    cout << "4. Edit Record\n";
    cout << "5. Delete Record\n";
    cout << "6. Output Analytics\n";
    cout << "7. Save Records to File\n";
    cout << "8. User Enter Check\n";
    cout << "9. Draw Graph\n";
    cout << "10. Output Profit\n";
    cout << "11. Output Loss\n";
    cout << "12. Total Value\n";
    cout << "0. Exit\n";
}

void add_record(vector<FinancialRecord>& records) {
    cout << "\nAdding a new financial record...\n";
    string id, date, description;
    double profit, loss;
    cout << "Enter ID: ";
    cin >> id;
    cout << "Enter date (YYYY-MM-DD): ";
    cin >> date;
    cout << "Enter description: ";
    cin.ignore(); // Clear input buffer
    getline(cin, description);
    cout << "Enter amount: ";
    cin >> profit;
    cout << "Enter loss amount: ";
    cin >> loss;
    int next_id = records.empty() ? 1 : stoi(records.back().id) + 1;
    records.push_back(FinancialRecord(to_string(next_id), date, description, profit, loss));
}

void edit_user(vector<User>& users) {
    cout << "\nEditing user details...\n";
    string username, new_name, new_password;
    cout << "Enter username to edit: ";
    cin >> username;
    for (User& user : users) {
        if (user.name == username) {
            cout << "Enter new name: ";
            cin >> new_name;
            cout << "Enter new password: ";
            cin >> new_password;
            user.name = new_name;
            user.password = new_password;
            cout << "User details updated successfully.\n";
            return;
        }
    }
    cout << "User not found.\n";
}

void delete_user(vector<User>& users) {
    cout << "\nDeleting a user...\n";
    string username;
    cout << "Enter username to delete: ";
    cin >> username;
    for (auto it = users.begin(); it != users.end(); ++it) {
        if (it->name == username) {
            users.erase(it);
            cout << "User deleted successfully.\n";
            return;
        }
    }
    cout << "User not found.\n";
}

void edit_record(vector<FinancialRecord>& records) {
    cout << "\nEditing a financial record...\n";
    string record_id;
    cout << "Enter the ID of the record you want to edit: ";
    cin >> record_id;

    for (FinancialRecord& record : records) {
        if (record.id == record_id) {
            cout << "Enter new date (YYYY-MM-DD): ";
            cin >> record.date;
            cout << "Enter new description: ";
            cin.ignore(); // Clear input buffer
            getline(cin, record.description);
            cout << "Enter new profit amount: ";
            cin >> record.profit;
            cout << "Enter new loss amount: ";
            cin >> record.loss;
            cout << "Record updated successfully.\n";
            return;
        }
    }
    cout << "Record not found.\n";
}

void delete_record(vector<FinancialRecord>& records) {
    cout << "\nDeleting a financial record...\n";
    string record_id;
    cout << "Enter the ID of the record you want to delete: ";
    cin >> record_id;

    for (auto it = records.begin(); it != records.end(); ++it) {
        if (it->id == record_id) {
            records.erase(it);
            cout << "Record deleted successfully.\n";
            return;
        }
    }
    cout << "Record not found.\n";
}

void output_analytics(const vector<FinancialRecord>& records) {
    cout << "\nGenerating analytics data...\n";
    double total_profit = 0, total_loss = 0;
    for (const FinancialRecord& record : records) {
        total_profit += record.profit;
        total_loss += record.loss;
    }
    cout << "Total Revenue: $" << total_profit << endl;
    cout << "Total Loss: $" << total_loss << endl;
    cout << "Net Profit: $" << (total_profit - total_loss) << endl;
}

void save_records_to_file(const vector<FinancialRecord>& records) {
    cout << "\nSaving records to a file...\n";
    ofstream outfile("financial_records.txt");
    if (outfile.is_open()) {
        for (const FinancialRecord& record : records) {
            outfile << record.id << "," << record.date << "," << record.description << "," << record.profit << "," << record.loss << endl;
        }
        outfile.close();
        cout << "Records saved to financial_records.txt successfully.\n";
    }
    else {
        cout << "Unable to open file to save records.\n";
    }
}

void user_enter_check() {
    // Functionality to check user authentication
    cout << "\nChecking user authentication...";
}

void draw_graph() {
    // Functionality to draw graphs
    cout << "\nDrawing graphs...";
}

void total_value(const vector<FinancialRecord>& records) {
    cout << "\nCalculating total value...\n";
    double total_profit = 0;
    for (const FinancialRecord& record : records) {
        total_profit += record.profit;
    }
    cout << "Total profit: $" << total_profit << endl;
}

void output_loss(const vector<FinancialRecord>& records) {
    cout << "\nCalculating and displaying loss...\n";
    double total_loss = 0;
    for (const FinancialRecord& record : records) {
        total_loss += record.loss;
    }
    cout << "Total loss: $" << total_loss << endl;
}

void output_profit(const vector<FinancialRecord>& records) {
    cout << "\nCalculating and displaying profit...\n";
    double total_value = 0;
    for (const FinancialRecord& record : records) {
        total_value += record.profit - record.loss;
    }
    cout << "Total value: $" << total_value << endl;
}

int main() {

    vector<FinancialRecord> records;
    
    vector<User> users;
    int choice;
    string username, password;
    do {
        cout << "\nMain Menu:\n1. Register New User\n2. Login\n3. Exit\nEnter your choice: ";
        cin >> choice;
        switch (choice) {
        case 1:
            register_user(users);
            break;
        case 2:
            if (login_user(users, username, password)) {
                int additional_choice;
                do {
                    display_additional_menu();
                    cout << "\nEnter your choice: ";
                    cin >> additional_choice;
                    switch (additional_choice) {
                    case 1:
                        add_record(records);
                        break;
                    case 2:
                        edit_user(users);
                        break;
                    case 3:
                        delete_user(users);
                        break;
                    case 4:
                        edit_record(records);
                        break;
                    case 5:
                        delete_record(records);
                        break;
                    case 6:
                        output_analytics(records);
                        break;
                    case 7:
                        save_records_to_file(records);
                        break;
                    case 8:
                        user_enter_check();
                        break;
                    case 9:
                        draw_graph();
                        break;
                    case 10:
                        output_profit(records);
                        break;
                    case 11:
                        output_loss(records);
                        break;
                    case 12:
                        total_value(records);
                        break;
                    case 0:
                        cout << "\nLogging out...\n";
                        break;
                    default:
                        cout << "\nInvalid choice. Please try again.\n";
                    }
                } while (additional_choice != 0);
            }
            break;
        case 3:
            cout << "\nExiting program...\n";
            break;
        default:
            cout << "\nInvalid choice. Please try again.\n";
        }
    } while (choice != 3);
    
    
    return 0;
}
