#include <iostream>
#include <array>
#include <time.h>
#include <ctime>
#include <functional>
#include <cstdlib>
#include <algorithm>

using namespace std;

void display_all_restaurants(array<string, 16> & restaurants, int & current_size) {
    for(int i = 0; i <= current_size - 1; i++) {
        if(i == current_size - 1) {
            cout << i << "-" << restaurants[i] << endl;
        }
        else {
            cout << i << "-" << restaurants[i] << ", ";
        }            
    } 
}

void add_a_restaurant(array<string, 16> & restaurants, int & current_size) {
    string name;
    bool correct_entry = true;
    cout << "please enter name of restaurant: " << endl;
    cin.ignore();
    getline(cin, name);
    if(current_size >= 16) {
        cout << "The array already has 16 restaurants and you can't add anymore." << endl;
    }
    else {
        for(int i = 0; i <= current_size - 1; i++) {
            if(restaurants[i] == name) {
                correct_entry = false;
            }
        }
        if(correct_entry == true) {
            restaurants[current_size] = name;
            current_size++;
            cout << "you added the restaurant " << name << endl;
        }
        else {
            cout << "this restaurant is already existant" << endl;
        }
    }
}

void remove_a_restaurant(array<string, 16> & restaurants, int & current_size) {
    string name;
    bool correct_entry = false;
    cout << "Please enter name of restaurant you would like to remove: " << endl;
    cin.ignore();
    getline(cin, name);
    for(int i = 0; i <= current_size -1; i++) {
        if(i == current_size && restaurants[i] == name) {
            current_size--;
            cout << name << " has been removed" << endl;
        }
        if(restaurants[i] == name) {
            restaurants[i] = restaurants[current_size -1];
            current_size--;
            correct_entry = true;
            cout << name << " has been removed" << endl;
        }
    }
    if(correct_entry == false) {
        cout << "restaurant does not exist" << endl;
    }
}

void shuffle_array(array<string, 16> & restaurants, int current_size) {
    random_shuffle (&restaurants[0], &restaurants[current_size]);
}

int round_counter(int current_size) {
    int round;
    if(current_size == 16) {
        round = 4;
    }
    else if(current_size == 8) {
        round = 3;
    }
    else if(current_size == 4) {
        round = 2;
    }
    else if(current_size == 2) {
        round =1;
    }
    return round;
}

int match_counter(int current_size) {
    int match;
    if(current_size == 16) {
        match = 8;
    }
    else if(current_size == 8) {
        match = 4;
    }
    else if(current_size == 4) {
        match = 2;
    }
    else if(current_size == 2) {
        match =1;
    }
    return match;
}

void begin_tournament(array<string, 16> & restaurants, int & current_size) {
    bool temp_bool = true;
    bool tourn_running = true;
    cin.ignore();
    string name;
    int match = match_counter(current_size);
    int round = round_counter(current_size);
    int current_round = 1;
    array<string,8> temp_array;
    while(tourn_running == true) {
        int current_match = 1;
        int place = 0;
        temp_bool = true;
        cin.ignore();
        for(int i = 0; i < current_size; i += 2) {
            while(temp_bool == true) {
                cout << "which restaurant: " << restaurants[i] << " or " << restaurants[i + 1] << endl;
                cout << "match " << current_match << "/" << match << " Round "
                    << current_round << "/" << round << endl;
                getline(cin, name);
                if(name == restaurants[i] or name == restaurants[i + 1]) {
                    if(name == restaurants[i]) {
                        temp_array[place] = name;
                    }
                    else {
                        temp_array[place] = name;
                    }
                    place ++;
                    temp_bool = false;
                    current_match++;
                }
                else {
                    cout << "invalid response " << name << endl;
                }
            }
            temp_bool = true;
        }
        while(temp_bool == true) {
            for(int i = 0; i < place; i++) {
                restaurants[i] = temp_array[i];
            }
            current_size = current_size/2;
            if(current_size == 1) {
                cout << "this is the winner " << restaurants[0] << endl;
                exit(0);
            }
            else {
                cout << "next round of tournament" << endl;
                temp_bool = false;
            }
        }
        match = match/2;
        current_round++;
    }
}

void test_size(array<string,16> & restaurants, int & current_size) {
    if(current_size ==2 or current_size ==4 or current_size ==8 or current_size == 16) {
        cout << "you have 2^n" << endl;
        begin_tournament(restaurants, current_size);
    }
    else {
        cout << "you dont have 2^n number of restaurants, please remove or enter more" << endl;
    }
}

int main() {
    array<string,16> restaurants = {{
        "cafe rio",
        "india palace",
        "panda express",
        "subway",
        "quiznos",
        "olive garden",
        "jimmy johns",
        "cougareat",
    }};
    bool temp = true;
    int current_size = 8;
    srand(time(NULL));
    while(temp == true) {
        int input;
        cout << "pick a function" << endl;
        cout << "1)Display all restaurants\n2)Add a restaurant\n3)Remove a restaurant" << endl;
        cout << "4)Shufflle the array\n5)Begin the tournament" << endl;
        cin >> input;
        if(input == 1){
            display_all_restaurants(restaurants, current_size);
        }
        if(input == 2){
            add_a_restaurant(restaurants, current_size);
        }
        if(input == 3){
            remove_a_restaurant(restaurants, current_size);
        }
        if(input == 4){
            shuffle_array(restaurants, current_size);
        }
        if(input == 5){
            test_size(restaurants, current_size);
        }
    }
}
