#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;


struct property{
    string name;
    int value;
};

void roll_the_dice() {
    srand(time(NULL));
    int roll = rand() % 6 +1;
    int roll2 = rand() % 6 +1;
    cout << roll << " + "<< roll2 << " equals " << roll +roll2 << endl;
}

void report_current_money(int & current_money) {
    cout << "this is your current money" << endl;
    cout << current_money << endl;
}

void add_money(int & current_money) {
    cout << "how much money would you like to add? " << endl;
    int add;
    cin >> add;
    if(add < 0){
        cout << "please enter a positive number" << endl;
        add_money(current_money);
    }
    else {
        current_money += add;
        cout << current_money << endl;
    }
}

void spend_money(int & current_money) {
    cout << "how much money would you like to spend? " << endl;
    int minus;
    cin >> minus;
    if(current_money - minus < 0) {
        cout << "This would result in a negative number!" << endl;
    }
    else {
        current_money -= minus;
        cout << current_money << endl;
    }
}

void pass_go(int & current_money) {
    cout << "you passed go, collect 200 dollars!" << endl;
    current_money += 200;
}

bool has_property(vector<property> & props, string name) {
    bool has_prop = false;
    for(unsigned int i = 0; i < props.size(); i++) {
        if(name == props[i].name) {
            has_prop = true;
        }
    }
    return has_prop;
}

void buy_property(vector<property> & properties, int  & current_money) {
    bool success = false;
    int property_value = 0;
    string input_name;
    
    
    while(!success) {
        cout << "please enter property name: ";
        cin >> input_name;
        if (not has_property(properties, input_name) ){
            cout << "What is the value of your property?" << endl;
            cin >> property_value;
            while(property_value < 0) {
                cout << "incorrect property value.  Please try again." << endl;
                cin >> property_value;
            }
            if(current_money - property_value < 0) {
                cout << "you dont have enough money to purchase this." << endl;
                break;
            }
            current_money -= property_value;
            properties.push_back(property{input_name, property_value});
            success = true;
        }
        else {
            cerr << "you already have that property" << endl;
            break;
        }
    }

}

void sell_property(vector<property> &  properties, int & current_money) {
    string property_to_sell;
    cout << "please enter the property name you would like to sell: " << endl;
    cin >> property_to_sell;
    if(has_property(properties, property_to_sell)) {
       for(unsigned int i = 0; i < properties.size(); i++) {
          if(properties[i].name == property_to_sell) {
              cout << "enter value for sale" << endl;
              int sale;
              cin >> sale;
              if(sale < 0){
                  cout << "can't be nagative" << endl;
                  break;
              }
              properties[i].value = sale;
              current_money += properties[i].value;
              properties.erase(properties.begin()+i);
          } 
       }
    }
    else {
        cout << "you dont own that property to be able to sell it" << endl;
    }
}

void quit_game() {
    cout << "thanks for playing!" << endl;
    exit (0);
}

ostream & operator<<(ostream & os, const property & prop) {
    os << "{name: '" << prop.name
        << "', value: " << prop.value
        << "}";
    return os;
}

void display_properties(vector<property> & properties) {
    cout << "found the following "
        << properties.size() << " properties:" << endl;
    for(unsigned int i = 0; i < properties.size(); i++) {
        cout << properties[i] << endl;
    }
}

void play_game(vector<property> & properties, int & current_money) {

    bool keep_playing = true;
    while(keep_playing){
        int choice;
        cout << "Welcome to Monopoly" << endl;
        cout << "please enter a number correspoding to what function you would like to run" << endl;
        cout << "1) Roll the dice\n2) Report the player's current money\n3) Add money\n4) Spend money" << endl;
        cout << "5) Pass GO\n6) Buy Property\n7)Sell Property\n8)Display owned properties\n9) Quit the program" << endl;
        cin >> choice;
        if(choice == 1)
            roll_the_dice();
        else if(choice == 2)
            report_current_money(current_money);
        else if(choice == 3)
            add_money(current_money);
        else if(choice == 4)
            spend_money(current_money);
        else if(choice == 5)
            pass_go(current_money);
        else if(choice == 6)
            buy_property(properties, current_money);
        else if(choice == 7)
            sell_property(properties, current_money);
        else if(choice == 8)
            display_properties(properties);
        else if(choice == 9)
            quit_game();
    }

}

int main() {
    int current_money = 1500;
    vector<property> properties;
    play_game(properties, current_money);

    return 0;
}
