/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/cppFiles/main.cc to edit this template
 */

/* 
 * File:   main.cpp
 * Author: caleb
 *
 * Created on March 4, 2024, 7:18 PM
 */

#include <iostream>
#include <ncurses.h>
#include <vector>

using namespace std;
#include "rockPaperScissors.h"
#include "main.h"
#include "2DArrayOperations.h"

int main(){

    std::vector<std::vector<int>> vector = {
                                            {1, 2, 3, 4},
                                            {5, 6, 7, 8},
                                            {9, 10, 11, 12},
                                            {13, 14, 15, 16}
                                            };

    int ch;
    static int selection = 0;
    static int * selectionPointer = &selection;
    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();
    //clear();

   do {
        switch(ch) {
            case KEY_UP: 
                --selection;
            break;

            case KEY_DOWN:
                ++selection;
            break;
            case '\n':
                getch();
                endwin();

                switch (selection) {
                    case 0:
                        gameLoop();
                        break;
                    case 1:
                        cout << "\033[2J\033[1;1H"; // Clear screen unicode sequence
                        printf("2D Vector:\n%s\n", printVector(vector).c_str());
                        printf("getTotal: %i\n", getTotal(vector));
                        printf("getAverage: %i\n", getAverage(vector));
                        printf("getRowTotal 0: %i\n", getRowTotal(vector, 0));
                        printf("getColumnTotal 0: %i\n", getColumnTotal(vector, 0));
                        printf("getHighestInRow 0: %i\n", getHighestInRow(vector, 0));
                        printf("getHighestInColumn 0: %i\n", getHighestInColumn(vector, 0));
                        printf("getLowestInRow 3: %i\n", getLowestInRow(vector, 3));
                        printf("getLowestInColumn 3: %i\n", getLowestInColumn(vector, 3));
                        cout << "Press Enter to Continue";
                        getchar();
                        break;
                    case 2:
                        cout << "\033[2J\033[1;1H"; // Clear screen unicode sequence

                        cout << "Press Enter to Continue";
                        getchar();
                        break;
                }
                break;

            default:
                break;
        }
                // Ensure selection stays within bounds
        selection = (selection < 0) ? 0 : selection;
        selection = (selection > 2) ? 2 : selection;
        //std::system("clear");
        move(0, 0);
        printw("%s", printMenu(selectionPointer).c_str());
        refresh();
    } while ((ch = getch()) != '#');
    
    

    getch();
    endwin();
}


std::string printMenu(int* selection) {
    const int ARRAY_SIZE = 3;
    std::string outputString = "";
    std::string cursor[ARRAY_SIZE] = {"> ", "  ", "  "};
    std::string menu[ARRAY_SIZE] = {"Rock Paper Scissors", "2D Arrays", "Binary Search"};
    //printf("%i", *selection);
    /*
    if (*selection >= ARRAY_SIZE - 1) {
        *selection = 0;
    }
    if (*selection < 0) {
        *selection = ARRAY_SIZE - 1;
    }
    */

    std::string temp;
    for (int j = 0; j < *selection; ++j) {
        temp = cursor[j];
        cursor[j] = cursor[j + 1];
        cursor[j + 1] = temp;
    }
    //cursor[0] = temp;
    outputString.append("Use the arrow keys to navigate the menu. Press # to exit.\n");
    for (int i = 0; i < ARRAY_SIZE; ++i) {
        outputString.append(cursor[i]);
        outputString.append(menu[i]);
        outputString.append("\n");
    }
    return outputString;
}