/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package netzprog02_j_ultimatefinal;

import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.*;

/**
 *
 * @author Daniel Leese
 */
public class ServerWorker extends Thread implements Runnable {

    private Socket sock = null;
    private ObjectOutputStream oos = null;
    private ObjectInputStream ois = null;
    private BufferedWriter bwriter = null;
    private int vergebeneWorkerID;

    public ServerWorker(Socket socket) {
        sock = socket;
        this.start();
    }

    @Override
    public void run() {

        List list = List.getInstnce();
        boolean bool = true;
        try {
            oos = new ObjectOutputStream(sock.getOutputStream());
            ois = new ObjectInputStream(sock.getInputStream());

            bwriter = new BufferedWriter(new FileWriter("ergebnisse.txt", true));
            bwriter.write("ClientID\tWorkerID\tErgebins\n\n");

            vergebeneWorkerID = list.getNextWorkerID();
            oos.writeObject(vergebeneWorkerID);
            System.out.println("Worker " + vergebeneWorkerID + ": Verbunden :)");


            SumUpJob tmpJob = null;
            Object recv = new Object();
            while (bool) {
                recv = ois.readObject();
                if (recv instanceof String) {
                    String recvStr = new String((String) recv);
                    if (recvStr.equals("CLOSE")) {
                        bool = false;
                    } else {
                        if (recvStr.equals("getJob")) {
                            while (true) {// wird mit break abgebrochen
                                Thread.sleep(1000);
                                if (list.isJobListEmty() == false) {
                                    SumUpJob job = (SumUpJob) list.getNextObject();
                                    oos.writeObject(job);
                                    System.out.println("sende Job " + job.getId() + " an Worker " + vergebeneWorkerID);
                                    recv = ois.readObject();
                                    tmpJob = (SumUpJob) recv;
                                    System.out.println("bekahm Job " + tmpJob.getId() + " von Worker " + tmpJob.getWorkerID() + " Summe von " + tmpJob.getStart() + " bis " + tmpJob.getEnd() + " ist " + tmpJob.getErgebnis());
                                    bwriter.write(tmpJob.getClientID() + "\t\t" + tmpJob.getWorkerID() + "\t\t" + tmpJob.getErgebnis() + "\n");
                                    bwriter.flush();
                                    break;
                                }
                            }
                        }
                    }
                }
            }
//        } catch (EOFException ex) {
//            System.out.println("Worker closed");
        } catch (EOFException e) {
            System.out.println("worker " + vergebeneWorkerID + " EOFException");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerWorker.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e) {
            System.err.println(e);
        } catch (InterruptedException ex) {
            Logger.getLogger(ServerWorker.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("tschuess");
    }
}