package com.erp.alarm;

import com.erp.dto.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

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

/**
 * SCADA 데모(또는 실제 PLC 게이트웨이) 가 호출해서 작업자 폰으로 알람을 push 하는 엔드포인트.
 * 인증은 SecurityConfig 단계에선 permitAll 이지만, 시연 한정이므로 미인증 호출 허용.
 * 향후 운영 단계로 가면 ROLE_SYSTEM 같은 별도 가드 필요.
 */
@RestController
@RequestMapping("/api/demo/alarm")
@RequiredArgsConstructor
@Slf4j
public class AlarmController {

    private final AlarmWebSocketHandler alarmHandler;

    /**
     * POST /api/demo/alarm/trigger
     *
     * body: {
     *   "target_user_id": "ky",
     *   "alarm": {
     *     "code": "P-IN-HH",
     *     "severity": "CRITICAL",
     *     "title": "BW-A1 펌프 과압 / 누설 의심",
     *     "message": "...",
     *     "location": "펌프룸 A · BW-A1",
     *     "comp": "bw-a1"
     *   }
     * }
     */
    @PostMapping("/trigger")
    public ResponseEntity<ApiResponse<Map<String, Object>>> trigger(@RequestBody Map<String, Object> body) {
        String targetUserId = (String) body.get("target_user_id");
        if (!StringUtils.hasText(targetUserId)) {
            return ResponseEntity.badRequest().body(ApiResponse.error("target_user_id 가 필요합니다."));
        }
        @SuppressWarnings("unchecked")
        Map<String, Object> alarm = (Map<String, Object>) body.getOrDefault("alarm", new HashMap<>());
        alarm.putIfAbsent("ts", System.currentTimeMillis());

        int delivered = alarmHandler.sendAlarm(targetUserId, alarm);

        Map<String, Object> result = new HashMap<>();
        result.put("target_user_id", targetUserId);
        result.put("delivered_to", delivered);
        result.put("active_users", alarmHandler.activeUsers());

        log.info("[Alarm] trigger user={}, delivered={}", targetUserId, delivered);
        String msg = delivered > 0 ? "알람 전송됨 (" + delivered + "건)" : "수신자 미접속 — 알람 큐 없음";
        return ResponseEntity.ok(ApiResponse.success(result, msg));
    }

    /** GET /api/demo/alarm/status — 현재 ws 접속 사용자 목록 (디버그/시연 안전망) */
    @GetMapping("/status")
    public ResponseEntity<ApiResponse<Map<String, Object>>> status() {
        Map<String, Object> result = Map.of(
                "active_users", alarmHandler.activeUsers(),
                "active_count", alarmHandler.activeUsers().size()
        );
        return ResponseEntity.ok(ApiResponse.success(result, "ok"));
    }
}
