#include <iostream>
#include <vector>

using namespace std;

#include "Circle.h"

Circle::Circle(){}

vector<string> Circle::getNames() { //used to populate a vector with names
    string special = "Josephus";
    vector<string> names = {{
        "Jacob",
        "Isabella",
        "Ethan",
        "Sophia",
        "Michael",
        "Emma",
        "Jayden",
        "Olivia",
        "William",
        "Ava",
        "Alexander",
        "Emily",
        "Noah",
        "Abigail",
        "Daniel",
        "Madison",
        "Aiden" ,
        "Chloe",
        "Anthony",
    }};
    return names;
}

vector<string> Circle::playGame(int n, int m) {
    vector<string> names = getNames();
    vector<string> temp;
    if(n < 10 or n > 20){
        names = {};
        return names;
    }
    if(m < 0){
        names = {};
        return names;
    }
    for(int i = 0; i < 20 - n; i++) {
        names.pop_back();
    }
    names.push_back("Josephus"); //insures that Josephus will be in the game
    int count = 0;
    int threshold = 0;
    for(int i = 0; i < n; i++) {
        int hits = 0;
        while(hits < m) {
            if(names[count] == ""){
            }
            else {
                hits++;
            }
            if(hits == m) {
                temp.push_back(names[count]);
                names[count] = "";
                hits = 100;
            }
            count++;
            if(count+1 > names.size()) {
                count = 0;
                threshold++;
            }
            if(threshold > 100) {   //threshold against infinite loop
                hits = 100;
            }
        }
    }
    return temp;
}

int Circle::reportSafeIndex(int n, int m) { //uses similar function as playGame() to determine index
    vector<string> names = getNames();
    vector<string> temp;
    int count = 0;
    int threshold = 0;
    if(n < 10 or n > 20){
        return -1;
    }
    if(m < 0){
        return -1;
    }
    for(int i = 0; i < 20 - n; i++) {
        names.pop_back();
    }
    names.push_back("Josephus");
    for(int i = 0; i < n; i++) {
        int hits = 0;
        while(hits < m) {
            if(names[count] == ""){
            }
            else {
                hits++;
            }
            if(hits == m) {
                temp.push_back(names[count]);
                names[count] = "";
                hits = 100;
            }
            count++;
            if(count+1 > names.size()) {
                count = 0;
                threshold++;
            }
            if(threshold > 100) { //incase of infinite loop due to improper input
                hits = 100;
            }
        }
    }
    string index_holder = temp[n-1];
    int index = 0;
    names = getNames();
    for(unsigned int i = 0; i < names.size(); i++){
        if(names[i] == index_holder) {
            index = i+1;
        }
    }
    return index;
}
