#include "kniffel.h"
#include <iostream>
#include <iomanip>

using namespace std;

void print(Kniffel &k)
{
    int special_width[7] = {6, 6, 5, 6, 6, 7, 6};
    cout << "╔═══╤═══╤═══╤═══╤═══╤═══╦═════╦══════╤══════╤═════╤══════╤══════╤═══════╤══════╦═════╗" << endl;
    cout << "║   │   │   │   │   │   ║     ║Dreier│Vierer│Full │Kleine│Große │       │      ║     ║" << endl;
    cout << "║1er│2er│3er│4er│5er│6er║Bonus║Pasch │Pasch │House│Straße│Straße│Kniffel│Chance║Summe║" << endl;
    cout << "╠═══╪═══╪═══╪═══╪═══╪═══╬═════╬══════╪══════╪═════╪══════╪══════╪═══════╪══════╬═════╣" << endl;
    cout << "║";
    for(int i = 0; i < 6; i++)
    {
        if(k.sums[i] != -1)
        {

            cout << setw(3) << k.sums[i] << (i == 5 ? "" : "│");
        }
        else
        {
            cout << setw(3) << "" << (i == 5 ? "" : "│");
        }
    }
    cout << "║" << (hasBonus(k) ? "   35║" : "     ║");
    for(int i = 0; i < 7; i++)
    {
        if(k.specials[i] != -1)
        {

            cout << setw(special_width[i]) << k.specials[i] << (i == 6 ? "" : "│");
        }
        else
        {
            cout << setw(special_width[i]) << "" << (i == 6 ? "" : "│");
        }
    }
    cout << "║" << setw(5) << total(k) << "║" << endl;
    cout << "╚═══╧═══╧═══╧═══╧═══╧═══╩═════╩══════╧══════╧═════╧══════╧══════╧═══════╧══════╩═════╝" << endl;
}

bool hasBonus(Kniffel &k)
{
    int sum = 0;
    for(int i = 0; i < 6; i++)
    {
        if(k.sums[i] != -1)
        {
            sum += k.sums[i];
        }
    }
    if(sum < 63)
    {
        return false;
    }
    return true;
}

int total(Kniffel &k)
{
    int sum = 0;
    for(int i = 0; i < 6; i++)
    {
        if(k.sums[i] != -1)
        {
            sum += k.sums[i];
        }
    }
    if(sum >= 63)
    {
        sum += 35;
    }
    for(int i = 0; i < 7; i++)
    {
        if(k.specials[i] != -1)
        {
            sum += k.specials[i];
        }
    }
    return sum;
}

bool set_sum(Kniffel &k, Dice &d, int sides)
{
    if(k.sums[sides - 1] != -1)
    {
        return false;
    }
    k.sums[sides - 1] = sum_dice(d, sides);
    return true;
}

bool set_special(Kniffel &k, Dice &d, int special)
{
    if(k.failed)
    {
        if(k.specials[special] == -1 && special != 6)
        {
            k.specials[special] = 0;
            k.failed = false;
            return true;
        }
        return false;
    }

    int max = max_count(d);
    switch(special)
    {
        case 0:
            if(k.specials[0] == -1 && max > 2)
            {
                k.specials[0] = sum_dice(d);
                return true;
            }
            break;
        case 1:
            if(k.specials[1] == -1 && max > 3)
            {
                k.specials[1] = sum_dice(d);
                return true;
            }
            break;
        case 2:
            if(k.specials[2] == -1 && is_full_house(d))
            {
                k.specials[2] = 25;
                return true;
            }
            break;
        case 3:
            if(k.specials[3] == -1 && is_small_straight(d))
            {
                k.specials[3] = 30;
                return true;
            }
            break;
        case 4:
            if(k.specials[4] == -1 && is_great_straight(d))
            {
                k.specials[4] = 40;
                return true;
            }
            break;
        case 5:
            if(k.specials[5] == -1 && max == 5)
            {
                k.specials[5] = 50;
                return true;
            }
            break;
        case 6:
            if(k.specials[6] == -1)
            {
                k.specials[6] = sum_dice(d);
                return true;
            }
            break;
    }
    return false;
}

int choose_insert(Kniffel &k, Dice &d)
{
    string texts[] = {"1) Einser", "2) Zweier", "3) Dreier", "4) Vierer", "5) Fünfer", "6) Sechser"};
    cout << "Wählen Sie: " << endl;
    int count = 0;
    for(int i = 0; i < 6; i++)
    {
        if(k.sums[i] == -1)
        {
            cout << texts[i] << endl;
            count++;
        }
    }
    int max = max_count(d);
    if(k.specials[0] == -1 && max > 2)
    {
        cout << "7) Dreier Pasch" << endl;
        count++;
    }
    if(k.specials[1] == -1 && max > 3)
    {
        cout << "8) Vierer Pasch" << endl;
        count++;
    }
    if(k.specials[2] == -1 && is_full_house(d))
    {
        cout << "9) Full House" << endl;
        count++;
    }
    if(k.specials[3] == -1 && is_small_straight(d))
    {
        cout << "10) Kleine Straße" << endl;
        count++;
    }
    if(k.specials[4] == -1 && is_great_straight(d))
    {
        cout << "11) Große Straße" << endl;
        count++;
    }
    if(k.specials[5] == -1 && max == 5)
    {
        cout << "12) Kniffel" << endl;
        count++;
    }
    if(k.specials[6] == -1)
    {
        cout << "13) Chance" << endl;
        count++;
    }
    if(count == 0)
    {
        k.failed = true;
        if(k.specials[0] == -1)
        {
            cout << "7) Dreier Pasch streichen" << endl;
        }
        if(k.specials[1] == -1)
        {
            cout << "8) Vierer Pasch streichen" << endl;
        }
        if(k.specials[2] == -1)
        {
            cout << "9) Full House streichen" << endl;
        }
        if(k.specials[3] == -1)
        {
            cout << "10) Kleine Straße streichen" << endl;
        }
        if(k.specials[4] == -1)
        {
            cout << "11) Große Straße streichen" << endl;
        }
        if(k.specials[5] == -1)
        {
            cout << "12) Kniffel streichen" << endl;
        }
    }
    cout << "Wahl: ";
    int res = 0;
    cin >> res;
    return res;
}

bool is_finished(Kniffel &k)
{
    for(int i = 0; i < 6; i++)
    {
        if(k.sums[i] == -1)
        {
            return false;
        }
    }
    for(int i = 0; i < 7; i++)
    {
        if(k.specials[i] == -1)
        {
            return false;
        }
    }
    return true;
}