package myChat;


import java.net.*;
import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Scanner;

public class Client{
    // defining private properties    
   private Socket sock = null;
   BufferedReader reader;
   PrintWriter writer;
   String name;
   InputStreamReader streamReader;
   DataOutputStream outStream ;
   JTextField outgoing;
   JTextArea incoming;
   
   /* constructor     */
    public Client() {
        ;
    }
       
 
 /*start a small display window to show received messeges. It conveniently seperate the users text  
  *input field and data from other clients.
  *start a seperate thread to receive messages and update the window while the main thread blocks on 
  *user input
  *@
  **/   
 public void startMessageWindow(){
    JFrame frame = new JFrame("Internet Chat Client:Message Log");
    JPanel mainPanel = new JPanel();
    incoming = new JTextArea(15,50);
    incoming.setLineWrap(true);
    incoming.setEditable(false);
    incoming.setWrapStyleWord(true);
    JScrollPane qScroller = new JScrollPane(incoming);
    qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    outgoing= new JTextField(20);
    JButton sendButton= new JButton("Send");
    //JButton quitButton= new JButton("quit");
    sendButton.addActionListener(new SendButtonListener());
    //quitButton.addActionListener(new QuitButtonListener());
    mainPanel.add(qScroller);
    mainPanel.add(outgoing);
    mainPanel.add(sendButton);
    //mainPanel.add(quitButton);
    IncomingMessageThread runObject=new IncomingMessageThread();
    Thread readerThread= new Thread(runObject);
    readerThread.start();    
    
    frame.getContentPane().add(mainPanel); 
    frame.setSize(400,500);
    frame.setVisible(true);    
    }
public class IncomingMessageThread implements Runnable{
    private boolean runThread=true;
    public void run(){
        String message;
        while(runThread){
            try{
                while((message=reader.readLine())!=null){
                    System.out.println(" < " + message );
                    incoming.append(message +"\n");
                }
            }catch(Exception e){
                System.out.println("exception in thread: failed to display message " + e.getMessage());
            }
        }
                        
    }
    public void stopThread(){
        if (runThread){
            runThread=false;
        }
    }
}
    
public class SendButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent ev){
    try {
        outStream.writeUTF(name + outgoing.getText());
        outStream.flush();
    }
    catch(Exception e){
        System.out.println("error sending messege"+ e.getMessage());
    }
    outgoing.setText("");
    System.out.println("sending messege");
    outgoing.requestFocus();
    
    }
}
/*
public class QuitButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent ev){
    try{
        writer.flush();
        writer.close();
    }
    catch(Exception e){
        System.out.println("error closing stream"+ e.getMessage());
    }
    runObject.stopThread();
    sock.close();
    }
}
  */  
public static void init(){
    String serverName, nickName;
    int serverPort;
    Scanner sc = new Scanner(System.in);
    System.out.println("Welcome to CommandLineChat 0.1 alpha");
    System.out.println("====================================\n");
//if (args[0]==null){        
        System.out.print("Enter server IP: ");
        serverName = sc.nextLine();
//    }else serverName ="localhost";
//if (args[1]==null){
    serverPort= 7896;
//}else  serverPort=Integer.parseInt(args[1]); 
System.out.print("Choose your nickname: ");
       nickName = sc.nextLine();
       Client myclient = new Client();
    if (myclient.setupConnection(serverName,nickName,serverPort)==false){
        System.out.print("\n try again? choice;\n 1 retry same configuration \n 2 a new configuration \n anything else to quit " );
        try{
            if(sc.nextInt()==1){
                init();               
            }else if(sc.nextInt()==2){
                init();
            }
        }catch (NumberFormatException e){ 
            return ;
        }    
    }else myclient.startMessageWindow();
}
    
public boolean setupConnection(String serverName,String userName,int portNumber){
    name= userName;
    try{
        sock= new Socket(serverName,portNumber); 
        streamReader= new InputStreamReader(sock.getInputStream());
        reader= new BufferedReader(streamReader);
        //writer= new PrintWriter(
        outStream =new DataOutputStream(sock.getOutputStream());
    }catch(IOException ex){
        System.out.println("Unable to connect ");
        return false;
    }
    System.out.println("Connected on server: " + serverName + " ,port:" + portNumber +", as " + userName );    
    return true;
}
public static void main (String args[]) {
    init();
    
    }
}