/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.mycompany.turn.based.game;

/**
 *
 * @author Ellie
 */
import java.io.*;
import java.net.*;

public class GameServer {
    private ServerSocket ss;
    private int numPlayers;
    private ServerSideConnection player1;
    private ServerSideConnection player2;
    private int turnsMade;
    private int maxTurns;
    private int[] values;  //array ints 
    private int player1ButtonNum;
    private int player2ButtonNum;
    

    
    public GameServer(){
        System.out.println("--Game Server--");
        numPlayers = 0;
        turnsMade = 0;
        maxTurns = 4;
        values = new int[4]; //4 buttons, 4 values
        
        //rando generate value for buttons
        for (int i = 0; i < values.length; i++){
            values[i] = (int) Math.ceil(Math.random()* 100);  //rounded between 0-100
            System.out.println("Value #" + (i + 1) + " is " + values[i]);
        }
        
        try {
            ss = new ServerSocket(51734);   //set port, same as other
        } catch (IOException ex) {
            System.out.println("IOException from GameServer Constructor");
        }
    }
    
    public void acceptConnections(){
        // instructions for server waiting for connections 
        try {
            System.out.println("waiting for other players..");
            while (numPlayers < 2) {
                Socket s = ss.accept();  // begin accepting connections 
                numPlayers++; 
                System.out.println("Player #" + numPlayers + " has connected.");
                ServerSideConnection ssc = new ServerSideConnection(s, numPlayers); //pass socket, no of players
                // assigning server side connection runnables to correct player fields 
                if (numPlayers == 1) {
                    player1 = ssc;
                } else {
                    player2 = ssc;
                }
                // data in ssc run method will run in new thread
                Thread t = new Thread(ssc);
                t.start();
            }
            System.out.println("There are now 2 players. No longer accepting connections.");
        } catch (IOException ex) {
            System.out.println("IOException from accept Connections()");
        }
    }
    
    private class ServerSideConnection implements Runnable{
        private Socket socket; 
        private DataInputStream dataIn;
        private DataOutputStream dataOut; 
        private int playerID;
        
        public ServerSideConnection(Socket s, int id) {
            socket = s;
            playerID = id;
            try {
                dataIn = new  DataInputStream(socket.getInputStream());
                dataOut = new DataOutputStream(socket.getOutputStream());
            } catch (IOException ex) {
                System.out.println("IOException from ssc constructor");
            }
        }
        
        public void run() {
            try {
                dataOut.writeInt(playerID); //either 1/2
                dataOut.writeInt(maxTurns);
                dataOut.writeInt(values[0]);  //sending values of each button 
                dataOut.writeInt(values[1]);
                dataOut.writeInt(values[2]);
                dataOut.writeInt(values[3]);
                dataOut.flush();
                
                while (true){
                    if (playerID == 1){
                        player1ButtonNum = dataIn.readInt(); //read and assign int
                        System.out.println("Player 1 clicked button#" + player1ButtonNum);
                        player2.sendButtonNum(player1ButtonNum); //send data of other player
                    } else{
                        player2ButtonNum = dataIn.readInt();
                        System.out.println("Player 2 clicked button #" + player2ButtonNum);
                        player1.sendButtonNum(player2ButtonNum);
                    }
                    turnsMade++; //auto increment- until 2 each
                    if (turnsMade == maxTurns) {
                        System.out.println("Max turns have been reached");
                        break;
                    }
                }
                player1.closeConnection(); //end connection to both players 
                player2.closeConnection();
                    
            } catch (IOException ex){ 
                    System.out.println("IO Expection from run() SSC");
            }
        }
        
        public void sendButtonNum(int n) {
            try {
                dataOut.writeInt(n);
                dataOut.flush();
            } catch (IOException ex) {
                System.out.println("IOException from sendButtonNum() ssc");
            }
        }
        
        public void closeConnection() {
            try {
                socket.close();
                System.out.println("Connection closed");
            } catch (IOException ex) {
                System.out.println("IOException on closeConnection() ssc");
            }
        }
    }
    
    public static void main(String[] args) {
        //instantiate
        GameServer gs = new GameServer();
        gs.acceptConnections();
    }
}


