/*
 * Copyright (C) 2021 eichehome
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package utils;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Logger;
import java.util.logging.Level;

/**
 * Dies Klasse stellt einen Client mit seinen Streams dar.
 *
 * @version 1.0.0
 * @author eichehome
 */
public class Client {

    /**
     * Attribut, welches den Stream enthält, in dem Nachrichten an den Thread
     * geschickt werden können, der diese an den Client weiterleitet.
     */
    private final ObjectOutputStream out;
    /**
     * Attribut, welches einen Zeiger auf den Thread enthält, welcher
     * Nachrichten an den Client schickt.
     */
    private final Thread sender;
    /**
     * Attribut, welches einen Zeiger auf den Thread enthält, welcher
     * Nachrichten von dem Client empfängt.
     */
    private final Thread reciver;

    /**
     * Konstruktor
     *
     * @param out Stream, um diesem Client Nachrichten schicken zu können.
     * @param sender Zeiger auf den Thread, der die Nachrichten an den Client
     * sendet.
     * @param reciver Zeiger auf den Thread, der die Nachrichten eines Clients
     * empfängt.
     */
    public Client(ObjectOutputStream out, Thread sender, Thread reciver) {
        this.out = out;
        this.sender = sender;
        this.reciver = reciver;
    }

    /**
     * Schreibe eine Nachricht in den OutputStream dieses Clients.
     *
     * @param message Die zu verschickende Nachricht.
     */
    public void writeMessage(Message message) {
        try {
            this.out.writeObject(message);
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, String.format("Client: Fehler: %s", ex));
        }
    }

    /**
     * Getter für den OutputStream diese Clients
     *
     * @return Zeiger auf den Stream.
     */
    public ObjectOutputStream getOutputStream() {
        return this.out;
    }

    /**
     * Getter für den Thread, der Nachrichten an diesen Client sendet.
     *
     * @return Zeiger auf den Thread.
     */
    public Thread getSender() {
        return this.sender;
    }

    /**
     * Getter für den Thread, der Nchrichten an diesen Client sendet.
     *
     * @return Zeiger auf den Thread.
     */
    public Thread getReciver() {
        return this.reciver;
    }
}
