import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
/**
 * Tic-Tac-Toe against human or CPU.
 * 
 * 
 */
public class Organized {
    //....Random....\\
    static Random rd = new Random();

    //....Buttons....\\
    static JButton butEasy = new JButton("Easy");
    static JButton butHard = new JButton("Hard");
    static JButton butHvH  = new JButton("Vs. A Friend");
    static JButton butX    = new JButton("X");
    static JButton butO    = new JButton("O");
    static JButton butA    = new JButton("");
    static JButton butB    = new JButton("");
    static JButton butC    = new JButton("");
    static JButton butD    = new JButton("");
    static JButton butE    = new JButton("");
    static JButton butF    = new JButton("");
    static JButton butG    = new JButton("");
    static JButton butH    = new JButton("");
    static JButton butI    = new JButton("");
    static JButton butA1   = new JButton("");
    static JButton butB1   = new JButton("");
    static JButton butC1   = new JButton("");
    static JButton butD1   = new JButton("");
    static JButton butE1   = new JButton("");
    static JButton butF1   = new JButton("");
    static JButton butG1   = new JButton("");
    static JButton butH1   = new JButton("");
    static JButton butI1   = new JButton("");
    static JButton butSame = new JButton("");

    //....Labels....\\
    static JLabel mssg  = new JLabel ("Please choose a difficulty.");
    static JLabel or    = new JLabel ("-Or-");

    //....Panels....\\
    static JPanel main    = new JPanel();
    static JPanel message = new JPanel();
    public static void main(String[] args) {
        //....Font....\\
        Font t = new Font("Courier",Font.BOLD,48);
        Font d = new Font("Courier",Font.BOLD,24);
        Font o = new Font("Courier",Font.BOLD,48);
        butA.setFont(t);
        butB.setFont(t);
        butC.setFont(t);
        butD.setFont(t);
        butE.setFont(t);
        butF.setFont(t);
        butG.setFont(t);
        butH.setFont(t);
        butI.setFont(t);
        butX.setFont(t);
        or.setFont(o);
        butO.setFont(t);
        butEasy.setFont(d);
        butHard.setFont(d);
        butHvH.setFont(d);

        //....Listener....\\
        HumanMove hMove = new HumanMove();
        butA.addActionListener(hMove);
        butB.addActionListener(hMove);
        butC.addActionListener(hMove);
        butD.addActionListener(hMove);
        butE.addActionListener(hMove);
        butF.addActionListener(hMove);
        butG.addActionListener(hMove);
        butH.addActionListener(hMove);
        butI.addActionListener(hMove);
        Menu options = new Menu();
        butX.addActionListener(options);
        butO.addActionListener(options);
        butEasy.addActionListener(options);
        butHvH.addActionListener(options);
        butHard.addActionListener(options);
        //....Layout....\\
        main.setLayout(new GridLayout(4,1));

        //....message....\\
        message.add(mssg);
        mssg.setText("Please choose a character.");

        //....main....\\
        main.add(butX);
        main.add(or);
        main.add(butO);
        main.add(message);

        //....Window....\\
        JFrame window = new JFrame("Tic-Tac-Toe");
        window.setContentPane(main);
        window.setSize(375,500);
        window.setLocation(100,100);
        window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        window.setVisible(true);
    }

    private static class Menu implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            HumanMove hMove = new HumanMove();
            Easy cMove      = new Easy();
            //....Character Selection....\\
            if (evt.getSource() == butX || evt.getSource() == butO) {
                difficultySelection();
            }

            //....Game Setup....\\
            if (evt.getSource() == butEasy || evt.getSource() == butHard || evt.getSource() == butHvH) {
                ticTacToeSetup();
            }
            //....Vs. A Friend....\\
            if (evt.getSource() == butHvH) {
                hMove.actionPerformed(evt);
            }
            //....Easy....\\
            if (evt.getSource() == butEasy) {
                cMove.actionPerformed(evt);
            }
        }
    }
    
     private static class Easy implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            
        }
    }
    
    private static class HumanVHuman implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            if (evt.getSource() == butX) {
                String letter = "X";
                String turn = "It is O's turn.";
            } else if (evt.getSource() == butO) {
                String letter = "O";
                String turn = "It is X's turn.";
            }
        }
    }
    
    private static class HumanMove implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            Winner isThere = new Winner();
            
                if (evt.getSource() == butA) {
                    butA.setText(letter);
                    mssg.setText(turn);
                    butA1 = butA;
                    butA = butSame;
                } else if (evt.getSource() == butB) {
                    butB.setText(letter);
                    mssg.setText(turn);
                    butB1 = butB;
                    butB = butSame;
                } else if (evt.getSource() == butC) {
                    butC.setText(letter);
                    mssg.setText(turn);
                    butC1 = butC;
                    butC = butSame;
                } else if (evt.getSource() == butD) {
                    butD.setText(letter);
                    mssg.setText(turn);
                    butD1 = butD;
                    butD = butSame;
                } else if (evt.getSource() == butE) {
                    butE.setText(letter);
                    mssg.setText(turn);
                    butE1 = butE;
                    butE = butSame;
                } else if (evt.getSource() == butF) {
                    butF.setText(letter);
                    mssg.setText(turn);
                    butF1 = butF;
                    butF = butSame;
                } else if (evt.getSource() == butG) {
                    butG.setText(letter);
                    mssg.setText(turn);
                    butG1 = butG;
                    butG = butSame;
                } else if (evt.getSource() == butH) {
                    butH.setText(letter);
                    mssg.setText(turn);
                    butH1 = butH;
                    butH = butSame;
                } else if (evt.getSource() == butI) {
                    butI.setText(letter);
                    mssg.setText(turn);
                    butI1 = butI;
                    butI = butSame;
                }
                isThere.actionPerformed(evt);
            }
        }
    
    
    private static class Winner implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            String turn   = "O";
            String letter = "X";
            if ((butA1.getText() == (turn) && butB1.getText() == (turn) && butC1.getText() == (turn)) ||
            (butA1.getText() == (turn) && butE1.getText() == (turn) && butI1.getText() == (turn)) ||
            (butA1.getText() == (turn) && butD1.getText() == (turn) && butG1.getText() == (turn)) ||
            (butB1.getText() == (turn) && butE1.getText() == (turn) && butH1.getText() == (turn)) ||
            (butC1.getText() == (turn) && butF1.getText() == (turn) && butI1.getText() == (turn)) ||
            (butC1.getText() == (turn) && butE1.getText() == (turn) && butG1.getText() == (turn)) ||
            (butD1.getText() == (turn) && butE1.getText() == (turn) && butF1.getText() == (turn)) ||
            (butG1.getText() == (turn) && butH1.getText() == (turn) && butI1.getText() == (turn))) {
                mssg.setText(turn + " Wins!");
                butA = butSame;
                butB = butSame;
                butC = butSame;
                butD = butSame;
                butE = butSame;
                butF = butSame;
                butG = butSame;
                butH = butSame;
                butI = butSame;
            } else if ((butA1.getText() == (letter) && butB1.getText() == (letter) && butC1.getText() == (letter)) ||
            (butA1.getText() == (letter) && butE1.getText() == (letter) && butI1.getText() == (letter)) ||
            (butA1.getText() == (letter) && butD1.getText() == (letter) && butG1.getText() == (letter)) ||
            (butB1.getText() == (letter) && butE1.getText() == (letter) && butH1.getText() == (letter)) ||
            (butC1.getText() == (letter) && butF1.getText() == (letter) && butI1.getText() == (letter)) ||
            (butC1.getText() == (letter) && butE1.getText() == (letter) && butG1.getText() == (letter)) ||
            (butD1.getText() == (letter) && butE1.getText() == (letter) && butF1.getText() == (letter)) ||
            (butG1.getText() == (letter) && butH1.getText() == (letter) && butI1.getText() == (letter))) {
                mssg.setText(letter + " Wins!");
                butA = butSame;
                butB = butSame;
                butC = butSame;
                butD = butSame;
                butE = butSame;
                butF = butSame;
                butG = butSame;
                butH = butSame;
                butI = butSame;
            } else if ((butA1.getText() == ("X") || butA1.getText() == ("O")) &&
            (butB1.getText() == ("X") || butB1.getText() == ("O")) &&
            (butC1.getText() == ("X") || butC1.getText() == ("O")) &&
            (butD1.getText() == ("X") || butD1.getText() == ("O")) &&
            (butE1.getText() == ("X") || butE1.getText() == ("O")) &&
            (butF1.getText() == ("X") || butF1.getText() == ("O")) &&
            (butG1.getText() == ("X") || butG1.getText() == ("O")) &&
            (butH1.getText() == ("X") || butH1.getText() == ("O")) &&
            (butI1.getText() == ("X") || butI1.getText() == ("O"))){
                mssg.setText("It's a tie!");
            }
        }
    }
    

    public static void difficultySelection() {
        //....Remove....\\
        main.remove(butX);
        main.remove(or);
        main.remove(butO);
        main.remove(message); //This must be removed, then added again so it will remain on the bottom

        //....Add....\\
        main.add(butEasy);
        main.add(butHard);
        main.add(butHvH);
        main.add(message);
        mssg.setText("Please choose a difficulty."); 
    }

    public static void ticTacToeSetup() { 
        //....Remove....\\
        main.remove(butEasy);
        main.remove(butHard);
        main.remove(butHvH);
        main.remove(message);

        //....Layout....\\
        main.setLayout(new GridLayout(4,4));

        //....Add....\\
        main.add(butA);
        main.add(butB);
        main.add(butC);
        main.add(butD);
        main.add(butE);
        main.add(butF);
        main.add(butG);
        main.add(butH);
        main.add(butI);
        main.add(message);
    }
    
    public static int easyMove() {
        int move = rd.nextInt(8) + 1;
        return move;
    }
}