package ist.ass2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class NCBServer {
		
	public static void main(String[] args) throws Exception{
		ServerSocket listener = new ServerSocket(2399);
		System.out.println("Server is running.");
		try{
			while(true){
				Game game = new Game();
				Game.Player player1 = game.new Player(listener.accept(), 1);
				Game.Player player2 = game.new Player(listener.accept(), 2);
				player1.start();
				player2.start();
			}
		} finally{
			listener.close();
		}
	}
}

class Game{ 
	
	String [] playermove = new String[2];
	int gamecount = 0;
	
	public synchronized boolean legalMove(String move){
		if(move.equals("ninja") || move.equals("cowboy") || move.equals("bear")){
			return true;
		}
		return false;
	}
	
	public boolean checkRoundEnd(){
		if(playermove[0] != null && playermove[1] != null)
			return true;
		else
			return false;
	}
	
	
	class Player extends Thread{
		int playerid;
		Player opponent;
		Socket socket;
		BufferedReader reader;
		PrintWriter writer;
		int wins;
		int losses;
		int draws;
		
		public Player(Socket socket, int playerid){
			this.socket = socket;
			this.playerid = playerid;
			try{
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream());
				writer.println("WELCOME Player " + playerid);
				writer.flush();
				
			} catch(IOException e){
				e.printStackTrace();
			}
		}
		
        public void setScore(){
            //For Player 1
            if(playerid == 1){
                    //win
                    if(playermove[0].equals("ninja") && playermove[1].equals("cowboy")){
                            writer.println("RESULT Player 1 wins");
                            writer.flush();
                            wins++;
                    }
                    else if(playermove[0].equals("cowboy") && playermove[1].equals("bear")){
                            writer.println("RESULT Player 1 wins");
                            writer.flush();
                            wins++;
                    }
                    else if(playermove[0].equals("bear") && playermove[1].equals("ninja")){
                            writer.println("RESULT Player 1 wins");
                            writer.flush();
                            wins++;
                    }
                    //tie
                    else if(playermove[0].equals("bear") && playermove[1].equals("bear")){
                            writer.println("RESULT Draw");
                            writer.flush();
                            draws++;
                    }
                    else if(playermove[0].equals("cowboy") && playermove[1].equals("cowboy")){
                            writer.println("RESULT Draw");
                            writer.flush();
                            draws++;
                    }
                    else if(playermove[0].equals("ninja") && playermove[1].equals("ninja")){
                            writer.println("RESULT Draw");
                            writer.flush();
                            draws++;
                    }
                    else{
                            writer.println("RESULT Player 2 wins");
                            writer.flush();
                            losses++;
                    }
            }
            if(playerid == 2){
                    //win
                    if(playermove[1].equals("ninja") && playermove[0].equals("cowboy")){
                            wins++;
                    }
                    else if(playermove[1].equals("cowboy") && playermove[0].equals("bear")){
                            wins++;
                    }
                    else if(playermove[1].equals("bear") && playermove[0].equals("ninja")){
                            wins++;
                    }
                    //tie
                    else if(playermove[1].equals("bear") && playermove[0].equals("bear")){
                            draws++;
                    }
                    else if(playermove[1].equals("cowboy") && playermove[0].equals("cowboy")){
                            draws++;
                    }
                    else if(playermove[1].equals("ninja") && playermove[0].equals("ninja")){
                            draws++;
                    }
                    else{
                            losses++;
                    }
            }
    }
		
		public void run(){
			try{
				String command;
				gamecount = 1;
				
				writer.println("MSG All players connected");
				writer.flush();

				writer.println("MOVE (Round " + gamecount + ") " + "Your Move! ninja - cowboy - bear");
				writer.flush();


				while(true){
					while((command = reader.readLine()) != null){
						if(legalMove(command)){
							if(playerid == 1){
								playermove[0] = command;
							}
							else{
								playermove[1] = command;
							}
							if(checkRoundEnd()){
								gamecount++;
								break;
							}
							writer.println("MSG Please wait for your opponent");
							writer.flush();
							break;
						}
						else{
							writer.println("ERROR: please type only ninja, cowboy or bear");
							writer.flush();
						}
					}
					System.out.println("DEBUG" + playerid);
					if(checkRoundEnd()){
						setScore();
						writer.println("MOVE (Round " + gamecount + ") " + "Your Move! ninja - cowboy - bear");
						writer.flush();
						if(playerid == 1)
							playermove[0] = null;
						else
							playermove[1] = null;
					}
				}
			} catch (IOException e){
				e.printStackTrace();
			}
		}
	}
}








