#include <iostream>
#include <random>
#include <string>
#include <format>
#include <time.h>
using namespace std;

void print_backgammon(string player1, string player2, int steine[24], int player1besitz, int player2besitz);
int getWuerfelinArray(int wuerfel[4], int user_input);

/* STEIN INTELLIGENCE:
int randInt(const int min, const int max) {
    static mt19937 rng{ random_device{}() };
    uniform_int_distribution<int> dist(min, max);
    return dist(rng);
}
*/

int main(int argc, char** args){
    if (argc != 3)
    {
        cout << "Es müssen genau zwei Spielernamen angegeben sein." << endl;
    } else
    {
        // player1 blau 34m positiv
        // player2 rot 31m negativ
        // \033[34m

        int steine[24] = {
            2, 0, 0, 0, 0, -5, 0, -3, 0, 0, 0, 5,
            -5, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, -2
        };

        string player1 = args[1];
        string player2 = args[2];

        int player1besitz = 1;
        int player2besitz = 1;

        print_backgammon(player1, player2, steine, player1besitz, player2besitz);
        srand(time(nullptr));
        int round = rand() % 2;
        int user_input = 0;
        int wuerfel[4] = {0,0,0,0};

        while (user_input != 3)
        {
            int current_besitz = 0;
            print_backgammon(player1, player2, steine, player1besitz, player2besitz);
            round += 1;
            if (round % 2 == 0) {
                cout << "Es ist " << "\033[34m" << player1 << "\033[0m" << " an der Reihe" << endl;
                string current_player = "\033[34m" + player1 + "\033[0m";
                current_besitz = player1besitz;
            } else {
                cout << "Es ist " << "\033[31m" << player2 << "\033[0m" << " an der Reihe" << endl;
                string current_player = "\033[31m" + player2 + "\033[0m";
                current_besitz = player2besitz;
            }

            wuerfel[0] = rand() % 6 + 1;
            wuerfel[1] = rand() % 6 + 1;
            if (wuerfel[0] == wuerfel[1]) {
                wuerfel[2] = wuerfel[1];
                wuerfel[3] = wuerfel[1];
            } else {
                wuerfel[2] = 0;
                wuerfel[3] = 0;
            }

            for (int i = 0; i < 4; i ++)
            {
                if (wuerfel[i] != 0)
                {
                    cout << wuerfel[i] << " ";
                }
            }
            cout << endl;

            cout << "Wähle   1 Würfel ziehen     2 Passen     3 Spiel beenden: ";
            cin >> user_input;
            
            if (user_input == 1 && !(wuerfel[0] == 0 && wuerfel[1] == 0 && wuerfel[2] == 0 && wuerfel[3] == 0))
            {
                if (current_besitz > 0)
                {
                    print_backgammon(player1, player2, steine, player1besitz, player2besitz);
                    cout << "Welcher Würfel soll für das einsetzen deiner besitzten Steine verwendet werden?" << endl;
                    cout << "Wähle    0 Passen";
                    int counter = 1;
                    for (int i = 0; i < 4; i++)
                    {
                        if (wuerfel[i] != 0)
                        {
                            cout << "     " << counter << " Würfel" << " [" << wuerfel[i] << "]: ";
                            counter += 1;
                        }
                    }
                    cin >> user_input;
                    if (user_input != 0)
                    {
                        // Stein einsetzen
                        int wuerfelIndex = getWuerfelinArray(wuerfel, user_input);
                        if (round % 2 == 0) // Wenn Player 1
                        {
                            if (steine[wuerfel[wuerfelIndex]-1] < 0)
                            {
                                cout << "Hier liegen bereits Steine des Gegners!" << endl;
                            }
                            else
                            {
                                player1besitz -= 1;
                                steine[wuerfel[wuerfelIndex]-1] += 1;
                            }
                        }
                        else // Wenn Player 2
                        {
                            if (steine[24 - wuerfel[wuerfelIndex]] > 0)
                            {
                                cout << "Hier liegen bereits Steine des Gegners!" << endl;
                            }
                            else
                            {
                                player2besitz -= 1;
                                steine[24 - wuerfel[wuerfelIndex]] -= 1;
                            }
                        }
                    }
                }
            }
        }
    }
}

void print_backgammon(string player1, string player2, int steine[24], int player1besitz, int player2besitz)
{
    cout << "\033[2J";
    cout << "\033[34m" << player1 << ": " << "\033[0m" << string(player1besitz, '0') << endl;

    for (int i = 0; i < 24; i++) {
        int current_value = steine[i];
        cout << format("{:<3} ", format("{}:", i + 1));
        if (current_value > 0) {
            cout << "\033[34m" << string(current_value, '0') << "\033[0m" << endl;
        } else if (current_value < 0) {
            cout << "\033[31m" << string(current_value * -1, '0') << "\033[0m" << endl;
        } else {
            cout << endl;
        }
    }

    cout << "\033[31m" << player2 << ": " << "\033[0m" << string(player2besitz, '0') << endl;
}

int getWuerfelinArray(int wuerfel[4], int user_input)
{
    int count = 0;
    for (int i = 0; i < 4; i++)
    {
        if (wuerfel[i] != 0)
        {
            count += 1;
            if (count == user_input)
            {
                return i;
            }
        }
    }
}