#include "dice.h"
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;

void roll_dice(Dice &d)
{
    for (int i = 0; i < d.num_rolled; i++)
    {
            d.rolled[i] = (rand() % 6) + 1;
    }
    d.rolls_left --;
}

void print_dice(Dice &d)
{
    cout << "Gewürfelt: ";
    for (int i = 0; i < d.num_rolled; i++)
    {
        if (d.rolled[i] != 0)
        {
            cout << " " << d.rolled[i];
        }   
    }
    cout << endl;
    
    cout << "Herausgelegt: ";
    for (int i = 0; i < d.num_held; i++)
    {
        if (d.held[i] != 0)
        {
            cout << " " << d.held[i];
        }
    }
    cout << endl;
}

void print_result(Dice &d)
{
    cout << "Gewürfelt: ";
    for (int i = 0; i < d.num_rolled; i++)
    {
        cout << " " << d.rolled[i];
    }
    cout << endl;
}

char choose_roll(Dice &d)
{
    char user_input;
    cout << "N ... Erneut Würfeln" << endl;
    cout << "E ... Aktuelles Ergebnis verwenden" << endl;
    cout << "H ... Einen Würfel herauslegen" << endl;
    cout << "Z ... Herausgelegten Würfel zurücklegen" << endl;
    cout << "Wählen Sie: ";
    cin >> user_input;
    cout << endl;
    return user_input;
}

int choose_dice(Dice &d, bool rolled)
{
    int user_input;
    if (rolled)
    {
        int counter = 1;
        for (int i = 0; i < 5; i++)
        {
            if (d.rolled[i] != 0)
            {
                cout << "Würfel " << counter << ": " << d.rolled[i] << endl;
                counter ++;
            }
        }

        cout << "Wählen Sie: ";
        cin >> user_input;

        counter = 1;
        for (int i = 0; i < 5; i++)
        {
            if (d.rolled[i] != 0)
            {
                if (counter == user_input)
                {
                    return i;
                }
                counter ++;
            }
        }
    }
    else
    {
        int counter = 1;
        for (int i = 0; i < 5; i++)
        {
            if (d.held[i] != 0)
            {
                cout << "Würfel " << counter << ": " << d.held[i] << endl;
                counter ++;
            }
        }

        cout << "Wählen Sie: ";
        cin >> user_input;

        counter = 1;
        for (int i = 0; i < 5; i++)
        {
            if (d.held[i] != 0)
            {
                if (counter == user_input)
                {
                    return i;
                }
                counter ++;
            }
        }
    }
    return -1;
}

void hold_dice(Dice &d, int dice)
{
    for (int i = 0; i < 5; i++)
    {
        if (d.held[i] == 0)
        {
            d.held[i] = d.rolled[dice];
            d.rolled[dice] = 0;
            break;
        }
    }
    d.num_rolled --;
    d.num_held ++;
}

void return_dice(Dice &d, int dice)
{
    for (int i = 0; i < 5; i++)
    {
        if (d.rolled[i] == 0)
        {
            d.rolled[i] = d.held[dice];
            d.held[dice] = 0;
            break;
        }
    }
    d.num_rolled ++;
    d.num_held --;
}

void set_result(Dice &d)
{
    for (int i = 0; i < 5; i++)
    {
        if (d.held[i] != 0)
        {
            for (int i = 0; i < 5; i++) {
                if (d.rolled[i] == 0) {
                    d.rolled[i] = d.held[i];
                    break;
                }
            }

            d.held[i] = 0;
        }
    }
    d.num_held = 0;

    sort(d.rolled, d.rolled + 5);

    d.num_rolled = 5;
}

int sum_dice(Dice &d, int sides)
{
    int sum = 0;
    if (sides == 0)
    {
        for (int i = 0; i < 5; i++)
        {
            sum += d.rolled[i];
        }
        return sum;
    }

    else if (sum >= 1  || sum <= 6)
    {
        for (int i = 0; i < 5; i++)
        {
            if (d.rolled[i] == sides)
            {
                sum += d.rolled[i];
            }
        }
        return sum;
    }

    return 0;

}

int max_count(Dice &d)
{
    int haeufigkeit[6] = {0};
    for (int i = 0; i < 5; i++)
    {
        haeufigkeit[d.rolled[i]-1] ++;
    }
    sort(haeufigkeit, haeufigkeit + 6);

    return haeufigkeit[5];
}

bool is_full_house(Dice &d)
{
    int haeufigkeit[6] = {0};
    for (int i = 0; i < 5; i++)
    {
        haeufigkeit[d.rolled[i]-1] ++;
    }

    int countThree = 0;
    int countTwo = 0;

    for (int i = 0; i < 6; i++)
    {
        if (haeufigkeit[i] == 3)
        {
            countThree ++;
        }
        else if (haeufigkeit[i] == 2)
        {
            countTwo ++;
        }
        else if (haeufigkeit[i] == 0)
        {
            continue;
        }
        else
        {
            return false;
        }
    }
    return (countThree == 1 && countTwo == 1);
}

bool is_small_straight(Dice &d)
{
    bool present[7] = {false};
    for (int i = 0; i < 5; i++)
    {
        present[d.rolled[i]-1] = true;
    }

    for (int start = 0; start < 3; start++)
    {
        if (present[start] && present[start+1] && present[start+2] && present[start+3])
        {
            return true;
        }
    }
    return false;
}

bool is_great_straight(Dice &d)
{
    bool current_state = true;
    for (int i = 0; i < 4; i++)
    {
        if (d.rolled[i] + 1 != d.rolled[i+1])
        {
            current_state = false;
        }
    }

    return current_state;
}