package org.egl_cepgl.pm.config.websocket;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.egl_cepgl.pm.dto.ChatMessage;
import org.springframework.stereotype.Component;
//import org.springframework.web.socket.WebSocketSession;

import java.time.Instant;
import java.time.Duration;
import java.util.UUID;

//@Component
//class ChatSocketHandler implements WebSocketHandler
//{
//    //private final ObjectMapper mapper;
//    //private final Sinks.Replay<ChatMessage> sink = Sinks.replay(100);
//    private final Sinks.Many<ChatMessage> sink;
//
//    //Sinks.Many<ChatMessage> sink;
//    private final Flux<ChatMessage> outputMessages;
//
//    public ChatSocketHandler(Sinks.Many<ChatMessage> sink) {
//        this.sink= sink;
//        this.outputMessages = sink.asFlux();
//    }
//
//    @Override
//    public Mono<Void> handle(org.springframework.web.reactive.socket.WebSocketSession session)
//    {
//        System.out.println("handling WebSocketSession...");
//        session.receive()
//                .map(WebSocketMessage::getPayloadAsText)
//                .map(payload -> new ChatMessage(UUID.randomUUID().toString(), payload))
//                .doOnNext(System.out::println)
//                .subscribe(
//                        sink::tryEmitNext,
//                        sink::tryEmitError
//                );
//
//        return session.send(
//                Mono.delay(Duration.ofMillis(100))
//                        .thenMany(outputMessages.map(message -> {
//                            try {
//                                return session.textMessage(toJson(message));
//                            } catch (Exception e) {
//                                e.printStackTrace();
//                            }
//                            return null;
//                        }))
//        );
//    }
//
//    private String toJson(ChatMessage message) throws Exception {
//        //return mapper.writeValueAsString(message);
//        return new ObjectMapper().writeValueAsString(message);
//    }
//}