package gc.mda.signal_batch.monitoring.controller;

import gc.mda.signal_batch.monitoring.service.TrackStreamingMetrics;
import gc.mda.signal_batch.global.websocket.service.StompTrackStreamingService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.view.RedirectView;

import java.util.HashMap;
import java.util.Map;


@Slf4j
@RestController
@RequestMapping("/api/websocket")
@RequiredArgsConstructor
@Tag(name = "WebSocket 모니터링 API", description = "WebSocket 스트리밍 상태 및 쿼리 진행 상황 모니터링 API")
public class WebSocketMonitoringController {

    private final TrackStreamingMetrics trackStreamingMetrics;
    private final StompTrackStreamingService trackStreamingService;

    /**
     * WebSocket 스트리밍 현황 조회
     */
    @GetMapping("/status")
    @Operation(summary = "WebSocket 스트리밍 현황", description = "활성 쿼리 수, 메모리 사용량, 서버 시간 등 WebSocket 스트리밍 전반의 상태를 조회합니다")
    public ResponseEntity<Map<String, Object>> getStreamingStatus() {
        Map<String, Object> status = new HashMap<>();
        
        // 활성 쿼리 수
        status.put("activeQueries", trackStreamingMetrics.getActiveQueryCount());
        
        // 메모리 사용량
        trackStreamingMetrics.recordMemoryUsage();
        Runtime runtime = Runtime.getRuntime();
        Map<String, Long> memory = new HashMap<>();
        memory.put("used", runtime.totalMemory() - runtime.freeMemory());
        memory.put("total", runtime.totalMemory());
        memory.put("max", runtime.maxMemory());
        status.put("memory", memory);
        
        // 서버 시간
        status.put("serverTime", System.currentTimeMillis());
        
        return ResponseEntity.ok(status);
    }

    /**
     * 특정 쿼리의 상태 조회
     */
    @GetMapping("/query/{queryId}/status")
    @Operation(summary = "쿼리 상태 조회", description = "특정 WebSocket 쿼리의 진행 상태, 메시지, 진행률, 스트리밍된 항적 수를 조회합니다")
    public ResponseEntity<Map<String, Object>> getQueryStatus(
            @Parameter(description = "쿼리 ID") @PathVariable String queryId) {
        Map<String, Object> result = new HashMap<>();
        
        var queryStatus = trackStreamingService.getQueryStatus(queryId);
        result.put("status", queryStatus.getStatus());
        result.put("message", queryStatus.getMessage());
        result.put("progress", queryStatus.getProgressPercentage());
        result.put("tracksStreamed", trackStreamingMetrics.getTracksStreamedForQuery(queryId));
        
        return ResponseEntity.ok(result);
    }

    /**
     * WebSocket 테스트 페이지로 리다이렉트
     */
    @GetMapping("/test")
    @Operation(summary = "WebSocket 테스트 페이지", description = "WebSocket 스트리밍 테스트 페이지로 리다이렉트합니다")
    public RedirectView redirectToTestPage() {
        return new RedirectView("/websocket/track-streaming-test.html");
    }
}