#include <iostream>

#include <string>


using namespace std;


class Loan {

protected:

    int loanID;

    double loanAmount;

    double interestRate;

    int loanTerm;

    string borrowerName;

    string loanStatus;


public:

    Loan(int id, double amount, double rate, int term, string name)

        : loanID(id), loanAmount(amount), interestRate(rate), loanTerm(term), borrowerName(name), loanStatus("Pending") {}


    int getLoanID() const {

        return loanID;

    }


    double getLoanAmount() const {

        return loanAmount;

    }


    virtual void displayDetails() {

        cout << "Loan ID: " << loanID << endl;

        cout << "Borrower: " << borrowerName << endl;

        cout << "Loan Amount: " << loanAmount << endl;

        cout << "Interest Rate: " << interestRate << endl;

        cout << "Loan Term: " << loanTerm << " months" << endl;

        cout << "Loan Status: " << loanStatus << endl;

    }


    virtual void updateLoanStatus(string status) {

        loanStatus = status;

    }


    virtual double calculatePayment() {

        return loanAmount * (1 + (interestRate / 100) * loanTerm);


    }

};



class PaymentSchedule : public Loan {

public:

    PaymentSchedule(int id, double amount, double rate, int term, string name)

        : Loan(id, amount, rate, term, name) {}


    void displayDetails() override {

        Loan::displayDetails();

        cout << "Payment: " << calculatePayment() << endl;

    }

};


class LoanManagementSystem {

private:

    static const int MAX_LOANS = 100;

    Loan* loans[MAX_LOANS];

    int numLoans;


public:

    LoanManagementSystem() : numLoans(0) {}


    void addLoan(Loan* loan) {

        if (numLoans < MAX_LOANS) {

            loans[numLoans++] = loan;

            cout << "Loan added successfully." << endl;

        } else {

            cout << "Loan limit reached. Cannot add more loans." << endl;

        }

    }


    void displayLoans() {

        for (int i = 0; i < numLoans; i++) {

            loans[i]->displayDetails();

            cout << endl;

        }

    }



void updateLoanStatus(int loanID, string newStatus) {

    for (int i = 0; i < numLoans; i++) {

        if (loans[i]->getLoanID() == loanID) {

            loans[i]->updateLoanStatus(newStatus);

            cout << "Loan status updated successfully." << endl;

            return;

        }

    }

    cout << "Loan not found." << endl;

}


void deleteLoan(int loanID) {

    for (int i = 0; i < numLoans; i++) {

        if (loans[i]->getLoanID() == loanID) {

            delete loans[i];

            loans[i] = loans[numLoans - 1];

            numLoans--;

            cout << "Loan deleted successfully." << endl;

            return;

        }

    }

    cout << "Loan not found." << endl;

}



void searchLoanByID(int loanID) {

    for (int i = 0; i < numLoans; i++) {

        if (loans[i]->getLoanID() == loanID) {

            loans[i]->displayDetails();

            return;

        }

    }

    cout << "Loan not found." << endl;

}


void generateReports() {

    double totalLoanAmount = 0.0;

    double totalInterestPaid = 0.0;


    cout << "Loan Reports" << endl;

    cout << "============" << endl;


    for (int i = 0; i < numLoans; i++) {

        totalLoanAmount += loans[i]->getLoanAmount();

        totalInterestPaid += loans[i]->calculatePayment() - loans[i]->getLoanAmount();

    }


    cout << "Total Number of Loans: " << numLoans << endl;

    cout << "Total Loan Amount: " << totalLoanAmount << endl;

    cout << "Total Interest Paid: " << totalInterestPaid << endl;

}


};


int main() {

    LoanManagementSystem system;


    while (true) {

        cout << "Loan Management System" << endl;

        cout << "1. Manage Loans" << endl;

        cout << "2. Search Loans" << endl;

        cout << "3. Reports of Loans" << endl;

        cout << "4. Exit" << endl;


        int choice;

        cin >> choice;


        switch (choice) {

            case 1: {

                cout << "1. Add Loans" << endl;

                cout << "2. Update Loans" << endl;

                cout << "3. Display Loans" << endl;

                cout << "4. Delete Loans" << endl;

                cout << "5. Exit" << endl;


                int subChoice;

                cin >> subChoice;


                switch (subChoice) {

                    case 1: {

                        int id, term;

                        double amount, rate;

                        string name;


                        cout << "Enter Loan ID: ";

                        cin >> id;

                        cout << "Enter Borrower Name: ";

                        cin.ignore();

                        getline(cin, name);

                        cout << "Enter Loan Amount: ";

                        cin >> amount;

                        cout << "Enter Interest Rate: ";

                        cin >> rate;

                        cout << "Enter Loan Term (months): ";

                        cin >> term;


                        Loan* newLoan = new PaymentSchedule(id, amount, rate, term, name);

                        system.addLoan(newLoan);

                        break;

                    }

                    case 2: {

                        int loanID;

                        string newStatus;

                        cout << "Enter Loan ID: ";

                        cin >> loanID;

                        cout << "Enter new status: ";

                        cin.ignore();

                        getline(cin, newStatus);

                        system.updateLoanStatus(loanID, newStatus);

                        break;

                    }

                    case 3: {

                        system.displayLoans();

                        break;

                    }

                    case 4: {

                        int loanID;

                        cout << "Enter Loan ID to delete: ";

                        cin >> loanID;

                        system.deleteLoan(loanID);

                        break;

                    }

                    case 5:

                        cout << "Returning to main menu." << endl;

                        break;

                    default:

                        cout << "Invalid choice. Please select a valid option." << endl;

                }

                break;

            }

            case 2: {

                int loanID;

                cout << "Enter Loan ID to search: ";

                cin >> loanID;

                system.searchLoanByID(loanID);

                break;

            }

            case 3: {

                

                system.generateReports();

                break;

            }

            case 4:

                cout << "Exiting..." << endl;

                return 0;

            default:

                cout << "Invalid choice. Please select a valid option." << endl;

        }

    }


    return 0;

}