package com.example.grpc.serviceapl;
/**
* Created by rayt on 5/16/16.
*/


import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import io.grpc.stub.StreamObserver;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ServiceAplClient extends Application {
private ObservableList<String> messages = FXCollections.observableArrayList();
private ListView<String> messagesView = new ListView<>();
private TextField name = new TextField("name");
private TextField message = new TextField();
private Button send = new Button();

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) {
messagesView.setItems(messages);

send.setText("Send");

BorderPane pane = new BorderPane();
pane.setLeft(name);
pane.setCenter(message);
pane.setRight(send);

BorderPane root = new BorderPane();
root.setCenter(messagesView);
root.setBottom(pane);

primaryStage.setTitle("gRPC Sericeapl");
primaryStage.setScene(new Scene(root, 480, 320));

primaryStage.show();

// ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9090).usePlaintext(true).build();
ManagedChannel channel = NettyChannelBuilder.forAddress("localhost", 9090).usePlaintext(true).build();
ServiceAplServiceGrpc.ServiceAplServiceStub stubServiceApl = ServiceAplServiceGrpc.newStub(channel);
StreamObserver<ServiceApl.ServiceAplMessageFromServer> objStreamObserver = new StreamObserverImpl(messages);
StreamObserver<ServiceApl.ServiceAplMessage> objServiceApl = stubServiceApl.serviceApl(objStreamObserver);

/*
StreamObserver<ServiceApl.ServiceAplMessage> objServiceApl = stubServiceApl.serviceApl(new StreamObserver<ServiceApl.ServiceAplMessageFromServer>() {
@Override
public void onNext(ServiceApl.ServiceAplMessageFromServer value) {
Platform.runLater*1;
messagesView.scrollTo(messages.size());
});
}

@Override
public void onError(Throwable t) {
t.printStackTrace();
System.out.println("Disconnected");
}

@Override
public void onCompleted() {
System.out.println("Disconnected");
}
});
* */

send.setOnAction(e -> {
objServiceApl.onNext(ServiceApl.ServiceAplMessage.newBuilder().setFrom(name.getText()).setMessage(message.getText()).build());
message.setText("");
});
primaryStage.setOnCloseRequest(e -> {objServiceApl.onCompleted(); channel.shutdown(); });
}
}

*1:) -> {
messages.add(value.getMessage().getFrom() + ": " + value.getMessage().getMessage(