#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
#include <ncurses.h>
#include "main.h"

#include "changedata.h"
#include "readdata.h"


int main()
{
	WINDOW *my_win;
	MYSQL* con = connectToMySQLServer();

	initscr();                              /* start the curses mode */
	noecho();
	keypad(stdscr, TRUE);
   
	refresh();
	int row,col, ch, option, position;
	int menuOption = -1;
	int seatmap[ROWS][COLUMNS]= {0};
	int ticketCount = 0;
	char username[STR_MAX];
	char password[STR_MAX];
	char bookingNumber[STR_MAX];
	char documentNumber[STR_MAX];
	char buffer[STR_MAX];
	char* seat = malloc(10 * sizeof(*seat));
	
	char *userOptions[USER_OPTIONS_CNT] = {"Name", "Document Number", "Seat", "Baggage", "Back"};
	char *adminOptions[ADMIN_OPTIONS_CNT] = {"Flight info", "Client info", "Exit"};
	char *assistantOptions[ASSISTANT_OPTIONS_CNT]= {"Client info", "Check-in info", "Exit"};
	
	
	start: ;
	clear();
	printIntro(&row, &col);
	//~ ch = printIntroMenu(&row, &col);
	
	while((ch = getch()) != KEY_F(2))
	{
		clear();
		refresh();
		switch(ch){
			case '1':
				my_win = create_newwin(5, 40, 1, col / 2 - 40/2);
				
				echo();
				wrefresh(my_win);
				//Ask for username
				mvwprintw(my_win, 1, 1, "Username:");
				wscanw(my_win, "%s", username);
				
				//Ask for password
				mvwprintw(my_win, 2, 1, "Password:");
				wscanw(my_win, "%s", password);
				
				// SIIA LÄHEB SQL KASUTAJA KONTROLL
				position = CheckUser(con, username, password);
				//~ mvwprintw(my_win, 3, 1, "Wrong username or password!");
				
				//~ if (strcmp(username, "admin") == 0)
				if (position == ADMIN)
				{
					snprintf(buffer, STR_MAX, "Logged in as admin");
					while (1)
					{
						admin_menu: ;
						option = optionMenu(adminOptions, ADMIN_OPTIONS_CNT, buffer, &row, &col);
						switch (option)
						{
							case FLIGHT_INFO:
								break;
							case CLIENT_INFO:
								CheckBooking(bookingNumber, &row, &col);
								menuOption = optionMenu(userOptions, USER_OPTIONS_CNT, buffer, &row, &col);
								break;
							case EXIT:
								goto start;
							default:
								break;
						}	
						option = NONE;
						switch (menuOption)
						{
							case NAME:
								ChangeName(bookingNumber, &row, &col);
								break;
							case DOCUMENT:
								ChangeDocument(bookingNumber, &row, &col);
								break;
							case SEAT:
								break;
							case BAGGAGE:
								ChangeBaggage(bookingNumber, &row, &col);
								break;
							case BACK:
								goto admin_menu;
								break;
							default:
								break;
						}
						menuOption = NONE;					
					}
					
				}
				//~ else if (strcmp(username, "assistant") == 0)
				else if (position == ASSISTANT)
				{
					snprintf(buffer, STR_MAX, "Logged in as assistant");
					while (1)
					{
						assistant_menu: ;
						option = optionMenu(assistantOptions, ASSISTANT_OPTIONS_CNT, buffer, &row, &col);
						switch (option)
						{
							case USER_INFO:
								CheckBooking(bookingNumber, &row, &col);
								menuOption = optionMenu(userOptions, USER_OPTIONS_CNT, buffer, &row, &col);
								break;
							case CHECK_IN:
								CheckIn(&row, &col);
								break;
							case EXIT:
								goto start;
								break;
							default:
								break;
						}
						option = NONE;
						switch (menuOption)
						{
							case NAME:
								ChangeName(bookingNumber, &row, &col);
								break;
							case DOCUMENT:
								ChangeDocument(bookingNumber, &row, &col);
								break;
							case SEAT:
								break;
							case BAGGAGE:
								ChangeBaggage(bookingNumber, &row, &col);
								break;
							case BACK:
								goto assistant_menu;
								break;
							default:
								break;
						}
						menuOption = NONE;
						
						
					}
				}
				//~ wgetch(my_win);
				break;
			case '2':
				my_win = create_newwin(6, 40, 1, col / 2 - 40/2);
				echo();
				wrefresh(my_win);
				
				mvwprintw(my_win, 1, 1, "Enter booking number:");
				mvwscanw(my_win, 2, 1, "%s", bookingNumber);
					
				mvwprintw(my_win, 3, 1, "Enter document number:");
				mvwscanw(my_win, 4, 1, "%s", documentNumber);
				
				//SIIA LÄHEB SQL KONTROLL
				
				snprintf(buffer, STR_MAX, "Booking number found!");
				
				optionMenu(userOptions, USER_OPTIONS_CNT, buffer, &row, &col);
				
				wgetch(my_win);
				break;
			case '3':
				int flightId = ShowDestinations(con, &row, &col);
				FillSeatmap(seatmap, ROWS, COLUMNS, con, flightId);
				PrintSeats(seatmap, ROWS, COLUMNS, &row, &col, seat);
				NewTicket(&row, &col, seat, flightId, con, ticketCount);
				ticketCount++;
				goto start;
				break;
			default:
				return 1;
		}
	}
	echo();
	endwin();
	free(seat);																					 
	return 0;
}

WINDOW *create_newwin(int height, int width, int starty, int startx)
{	
    WINDOW *local_win;
    local_win = newwin(height, width, starty, startx);
    box(local_win, 0 , 0);		/* 0, 0 gives default characters 
					   for the vertical and horizontal
					    lines			*/
    wrefresh(local_win);		/* Show that box 		*/
    return local_win;
}

void printIntro(int *row, int *col)
{
	char introMesg[] = "Welcome to booking system 'Boing'!";
    char action[] = "Choose action:";
    char logIn[] = "Press 1 to log in";
    char bookingNum[] = "Press 2 to enter booking number";
    char newFlight[] = "Press 3 to enter new flight";
    
    getmaxyx(stdscr, *row, *col); /* get the number of rows and columns */
    
    mvprintw(*row / 7,(*col-strlen(introMesg)) / 2, "%s", introMesg);                
    mvprintw(*row / 7 + 3,(*col - strlen(action)) / 2, "%s", action);        
    mvprintw(*row / 7 + 4,(*col - strlen(logIn)) / 2, "%s", logIn);    
    mvprintw(*row / 7 + 5,(*col - strlen(bookingNum)) / 2, "%s", bookingNum);    
    mvprintw(*row / 7 + 6,(*col - strlen(newFlight)) / 2, "%s", newFlight);    
}

int printIntroMenu(int *row, int *col)
{
	WINDOW *menu_win;
	clear();
	refresh();
	noecho();
	int i, choice;
	int highlight = 0;
	char *options[2] = {"Log In", "Change booking info",};
	char introMesg[] = "Welcome to booking system 'Boing'!";
	
	getmaxyx(stdscr, *row, *col); /* get the number of rows and columns */
    
 	
	menu_win = create_newwin(28, 100, 1, *col / 2 - 100/2);
	
    mvwprintw(menu_win, 1, 100 / 2 , "%s", introMesg);                
	
	//Check if booking exists!!!
	
	while (1)
	{
		for (i = 0; i < 2; i++)
		{
			if (i == highlight)
			{
				wattron(menu_win, A_REVERSE);
				mvwprintw(menu_win, i + 6, 100 / 2, "%s", options[i]);
				wattroff(menu_win, A_REVERSE);
			}
			else
			{
				mvwprintw(menu_win, i + 6, 100 / 2, "%s", options[i]);
			}
		}
		
		choice = wgetch(menu_win);
		switch(choice){
			case UP_KEY:
				highlight--;
				if (highlight == -1)
				{
					highlight = 0;
				}
				break;
			case DOWN_KEY:
				highlight++;
				if (highlight == 2)
				{
					highlight = 2 - 1;
				}
				break;
			default:
				break;
		}
		if (choice == ENTER_KEY)
		{
			
			break;
		}
	}
	mvwprintw(menu_win, 4 + 4, 100 / 2,  "Your choice was: %s", options[highlight]);
	wrefresh(menu_win);

	return highlight;
}