import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.awt.Desktop;
import java.net.URI;
import java.util.Scanner;
import java.util.Random;
import java.io.File;
import java.io.BufferedWriter;
import java.util.Vector;
import java.util.Arrays;
import java.util.Collections;

public class Project2 {

    static Scanner scnr = new Scanner(System.in);
    static String menu[] = {
        "======================== CS 3990 Assignment 1 ===============",
        "G/g:   Ask for a N, and generate N members of mixed",
        "               Member class's objects, and store in a Vector ",
        "       and a array Objects.",
        "",
        "S/s/ : Sort the members in the vector and array in",
        "               ascending order.",
        "",
        "V/v/ : Show the members in the vector and array .",
        "",
        "O/o/ : Save objects inside vector into a HTML file",
        "       with objects saved in the format of HTML",
        "       Table.",
        "F/f  : Show HTML file contents on screen.",
        "",
        "L/l  : Launch the default internet browser to",
        "       display the generated HTML file.",
        "--------------------------------------------------",
        "H/h/?: Display this menu.",
        "E/e  : Exit",
        "==============================================================",
    };

    //Data Members
    static int n;
    static Random rdn = new Random();
    static Member arr[] = null;
    static Vector<Member> vec = null;

    static char showAndGetMenuItem() {
        for(int i=0;i<menu.length;i++)
            System.out.printf("\n\t\t%s",menu[i]);
        System.out.printf("\n\t\t%s","Enter a command: G/S/V/O/F/L/H or E for quit: ");
        return scnr.next().trim().charAt(0);
    }

    public static void main(String args[]) {
        char choice = ' ';
        while(true) {
            choice = showAndGetMenuItem();
            switch(choice) {
                case 'G' : case 'g': generateAndStore(); break;
                case 'S' : case 's': sortItemsInVecAndArr(); break;
                case 'V' : case 'v': showMembersInVecAndArr(); break;
                case 'O' : case 'o': saveMembersIntoVecAndArr(); break;
                case 'F' : case 'f': showContentsOfHTMLFile(); break;
                case 'L' : case 'l': launchBrowser(); break;
                case 'H' : case 'h': case '?': break;
                case 'E' : case 'e': System.exit(0); break;
            }
        }
    }


    /*----------------------add number to nextInt()---------------*/

    static Member nextMember() {
        switch(rdn.nextInt(5)) {
            case 0: return new Member();
            case 1: return new Employee();
            case 2: return new Student();
            case 3: return new Faculty();
            case 4: return new Staff();
        }
        return new Member();
    }

    static void generateAndStore() {
        System.out.printf("\n\t\tMembers to be generated? ");
        n = scnr.nextInt();
        arr = new Member[n];
        vec = new Vector<Member>(n);
        for(int i=0;i<n;i++) {
            arr[i] = nextMember();
            vec.add(nextMember());
        }
    }

    static void sortItemsInVecAndArr() {
        Arrays.sort(arr);
        Collections.sort(vec);
    }

    static void showMembersInVecAndArr() {
        System.out.printf("\n\t\t================ Members in Array =================");
        for(int i = 0; i < arr.length; i++)
            System.out.printf("\n\t\t%s", arr[i].toString(true));
        System.out.printf("\n\t\t================ Members in Vector =================");
        for(int i = 0;  i < vec.size(); i++) 
            System.out.printf("\n\t\t%s", vec.get(i).toString());
    }

    static void saveMembersIntoVecAndArr() {
        BufferedWriter bfout = null;
        Member m = new Member();
        char[] cArr = null;

        try{
            bfout = new BufferedWriter(new FileWriter("members.html"));
            bfout.write("<HTML>\n\t<TABLE>\n");

            for(int i = 0; i < vec.size(); i++){
                bfout.write(vec.get(i).htmlRow());
                bfout.write("\n");
            }
            bfout.write("\t</TABLE>\n<HTML>\n");
            bfout.close();
        }catch(IOException e){e.printStackTrace();}
    }
    static void showContentsOfHTMLFile() {
        FileReader fin = null;
        int ch;
        try{
            fin = new FileReader("members.html");
            while((ch = fin.read()) != -1)
                System.out.printf("%c", ch);
            fin.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    static void launchBrowser(){
        if(Desktop.isDesktopSupported()){
            try{
                File file = new File("google.com");
                //Desktop.getDesktop().browse(file.toURI());
                Runtime runtime = Runtime.getRuntime();
                runtime.exec("/usr/bin/firefox - new-window " + " cs.csub.edu/~dfelix/3390/members.html");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}
