

#include <stdlib.h>
#include <iostream>
#include <stdio.h>

using namespace std;

#include "./factor_cube_dfs.h"
#include "./factor_cube_bfs.h"
#include "./factor_star_dfs.h"
#include "./factor_star_bfs.h"

#include "./vertex_cube_dfs.h"
#include "./vertex_cube_bfs.h"
#include "./vertex_star_dfs.h"
#include "./vertex_star_bfs.h"


int compare(const void * a, const void * b) {
    return ( *(int*) b - *(int*) a);
}

void menu() {

    char c, r;
    int vstup[9];

    FACTOR_CUBE_DFS * factor_cube_dfs;
    FACTOR_CUBE_BFS * factor_cube_bfs;
    FACTOR_STAR_DFS * factor_star_dfs;
    FACTOR_STAR_BFS * factor_star_bfs;
    VERTEX_CUBE_DFS * vertex_cube_dfs;
    VERTEX_CUBE_BFS * vertex_cube_bfs;
    VERTEX_STAR_DFS * vertex_star_dfs;
    VERTEX_STAR_BFS * vertex_star_bfs;

    cout << endl;
    cout << "-----------------------------------" << endl;
    cout << "- faktorizacia verzia 1.0 ---------" << endl;
    cout << "-----------------------------------" << endl << endl << endl;
    cout << "	Menu: " << endl << endl;
    cout << "   1 ---> Algoritmus 1 - cube" << endl << endl;
    cout << "   2 ---> Algoritmus 2 - cube" << endl << endl;
    cout << "   3 ---> Algoritmus 1 - star" << endl << endl;
    cout << "   4 ---> Algoritmus 2 - star" << endl << endl;
    cout << "   5 ---> Algoritmus 3 - cube" << endl << endl;
    cout << "   6 ---> Algoritmus 4 - cube" << endl << endl;
    cout << "   7 ---> Algoritmus 3 - star" << endl << endl;
    cout << "   8 ---> Algoritmus 4 - star" << endl << endl;
    cout << "   0 ---> Koniec programu" << endl << endl;
    cout << endl << endl;
    cout << "    Zadajte cislo prikazu: ";

    c = cin.get();

    switch (c) {
        case '1':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;
            
            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - pocas hladania faktora)" << endl;
                cout << "( 2 - na konci faktora)" << endl;
                cout << "( 3 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        vstup[3] = 0;
                        break;
                    case '3':
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
                vstup[3] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
            } else {
                vstup[4] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[5] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - na konci faktora)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[6] = 1;
                        vstup[7] = 0;
                        vstup[8] = 0;
                        break;
                    case '2':
                        vstup[6] = 0;
                        vstup[7] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[8] = 1;
                        } else {
                            vstup[8] = 0;
                        }
                        break;
                    default:
                        vstup[6] = 0;
                        vstup[7] = 0;
                        break;
                }


            } else {
                vstup[5] = 0;
            }

            factor_cube_dfs = new FACTOR_CUBE_DFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7], vstup[8]);
            
            break;
        case '2':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;
            
            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - pocas hladania faktora)" << endl;
                cout << "( 2 - na konci faktora)" << endl;
                cout << "( 3 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        vstup[3] = 0;
                        break;
                    case '3':
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
                vstup[3] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
            } else {
                vstup[4] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[5] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - na konci faktora)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[6] = 1;
                        vstup[7] = 0;
                        vstup[8] = 0;
                        break;
                    case '2':
                        vstup[6] = 0;
                        vstup[7] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[8] = 1;
                        } else {
                            vstup[8] = 0;
                        }
                        break;
                    default:
                        vstup[6] = 0;
                        vstup[7] = 0;
                        break;
                }


            } else {
                vstup[5] = 0;
            }

            factor_cube_bfs = new FACTOR_CUBE_BFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7], vstup[8]);

           
            break;
        case '3':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - pocas hladania faktora)" << endl;
                cout << "( 2 - na konci faktora)" << endl;
                cout << "( 3 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        vstup[3] = 0;
                        break;
                    case '3':
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
                vstup[3] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
            } else {
                vstup[4] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[5] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - na konci faktora)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[6] = 1;
                        vstup[7] = 0;
                        vstup[8] = 0;
                        break;
                    case '2':
                        vstup[6] = 0;
                        vstup[7] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[8] = 1;
                        } else {
                            vstup[8] = 0;
                        }
                        break;
                    default:
                        vstup[6] = 0;
                        vstup[7] = 0;
                        break;
                }


            } else {
                vstup[5] = 0;
            }
            
            factor_star_dfs = new FACTOR_STAR_DFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7], vstup[8]);
            
            break;
        case '4':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - pocas hladania faktora)" << endl;
                cout << "( 2 - na konci faktora)" << endl;
                cout << "( 3 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        vstup[3] = 0;
                        break;
                    case '3':
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        vstup[3] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
                vstup[3] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
            } else {
                vstup[4] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[5] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - na konci faktora)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[6] = 1;
                        vstup[7] = 0;
                        vstup[8] = 0;
                        break;
                    case '2':
                        vstup[6] = 0;
                        vstup[7] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[8] = 1;
                        } else {
                            vstup[8] = 0;
                        }
                        break;
                    default:
                        vstup[6] = 0;
                        vstup[7] = 0;
                        break;
                }


            } else {
                vstup[5] = 0;
            }

            factor_star_bfs = new FACTOR_STAR_BFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7], vstup[8]);
            
            break;
        case '5':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[3] = 1;
            } else {
                vstup[3] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[5] = 1;
                        vstup[6] = 0;
                        break;
                    case '2':
                        vstup[5] = 0;
                        vstup[6] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[7] = 1;
                        } else {
                            vstup[7] = 0;
                        }
                        break;
                    default:
                        vstup[5] = 0;
                        vstup[6] = 0;
                        break;
                }


            } else {
                vstup[4] = 0;
            }

            vertex_cube_dfs = new VERTEX_CUBE_DFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7]);
            
            break;
        case '6':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[3] = 1;
            } else {
                vstup[3] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[5] = 1;
                        vstup[6] = 0;
                        break;
                    case '2':
                        vstup[5] = 0;
                        vstup[6] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[7] = 1;
                        } else {
                            vstup[7] = 0;
                        }
                        break;
                    default:
                        vstup[5] = 0;
                        vstup[6] = 0;
                        break;
                }


            } else {
                vstup[4] = 0;
            }

            vertex_cube_bfs = new VERTEX_CUBE_BFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7]);

            break;
        case '7':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[3] = 1;
            } else {
                vstup[3] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[5] = 1;
                        vstup[6] = 0;
                        break;
                    case '2':
                        vstup[5] = 0;
                        vstup[6] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[7] = 1;
                        } else {
                            vstup[7] = 0;
                        }
                        break;
                    default:
                        vstup[5] = 0;
                        vstup[6] = 0;
                        break;
                }


            } else {
                vstup[4] = 0;
            }

            vertex_star_dfs = new VERTEX_STAR_DFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7]);

            break;
        case '8':
            r = cin.get();
            cout << "--------------------------------------------------------------------------------" << endl;

            cout << "Chcete pouzit semi-perfect test? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[0] = 1;
                cout << "Zdajate poziciu pouzitia semi-perfect test: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[1] = 1;
                        vstup[2] = 0;
                        break;
                    case '2':
                        vstup[1] = 0;
                        vstup[2] = 1;
                        break;
                    default:
                        vstup[1] = 0;
                        vstup[2] = 0;
                        break;
                }
            } else {
                vstup[0] = 0;
                vstup[1] = 0;
                vstup[2] = 0;
            }
            cout << "Chcete vypisat faktorizaciu na konzolu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[3] = 1;
            } else {
                vstup[3] = 0;
            }
            cout << "Chcete pouzit test izomorfizmu? (1 - ano, 0 - nie)" << endl;
            c = cin.get();
            r = cin.get();
            if (c == '1') {
                vstup[4] = 1;
                cout << "Zdajate poziciu pouzitia testu izomorfizmu: " << endl;
                cout << "( 1 - vo vrchole)" << endl;
                cout << "( 2 - na konci faktorizacie)" << endl;
                c = cin.get();
                r = cin.get();
                switch (c) {
                    case '1':
                        vstup[5] = 1;
                        vstup[6] = 0;
                        break;
                    case '2':
                        vstup[5] = 0;
                        vstup[6] = 1;
                        cout << "Chcete pouzit test d tabuliek? (1 - ano, 0 - nie)" << endl;
                        c = cin.get();
                        if (c == '1') {
                            vstup[7] = 1;
                        } else {
                            vstup[7] = 0;
                        }
                        break;
                    default:
                        vstup[5] = 0;
                        vstup[6] = 0;
                        break;
                }


            } else {
                vstup[4] = 0;
            }

            vertex_star_bfs = new VERTEX_STAR_BFS(vstup[0], vstup[1], vstup[2], vstup[3], vstup[4], vstup[5], vstup[6], vstup[7]);
            
            break;
        case '0':
            return;
        default:
            cout << "Zadali ste nespravny vstup do klavesnice" << endl;
            cout << endl << "Press any key to continue ...";
            r = cin.get();
            system("CLS");
            break;
    }
}

int main(int argc, char** argv) {

    menu();
    return (EXIT_SUCCESS);
}

