package com.kt.ai.controller;

import com.kt.ai.model.dto.response.JobStatusResponse;
import com.kt.ai.model.enums.JobStatus;
import com.kt.ai.service.CacheService;
import com.kt.ai.service.JobStatusService;
import io.swagger.v3.oas.annotations.Operation;
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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * Internal Job Controller
 * Event Service에서 호출하는 내부 API
 *
 * @author AI Service Team
 * @since 1.0.0
 */
@Slf4j
@Tag(name = "Internal API", description = "내부 서비스 간 통신용 API")
@RestController
@RequestMapping("/api/v1/ai-service/internal/jobs")
@RequiredArgsConstructor
public class InternalJobController {

    private final JobStatusService jobStatusService;
    private final CacheService cacheService;

    /**
     * 작업 상태 조회
     */
    @Operation(summary = "작업 상태 조회", description = "Redis에 저장된 AI 추천 작업 상태 조회")
    @GetMapping("/{jobId}/status")
    public ResponseEntity<JobStatusResponse> getJobStatus(@PathVariable String jobId) {
        log.info("Job 상태 조회 요청: jobId={}", jobId);
        JobStatusResponse response = jobStatusService.getJobStatus(jobId);
        return ResponseEntity.ok(response);
    }

    /**
     * Redis 디버그: Job 상태 테스트 데이터 생성
     */
    @Operation(summary = "Job 테스트 데이터 생성 (디버그)", description = "Redis에 샘플 Job 상태 데이터 저장")
    @GetMapping("/debug/create-test-job/{jobId}")
    public ResponseEntity<Map<String, Object>> createTestJob(@PathVariable String jobId) {
        log.info("Job 테스트 데이터 생성 요청: jobId={}", jobId);

        Map<String, Object> result = new HashMap<>();

        try {
            // 다양한 상태의 테스트 데이터 생성
            JobStatus[] statuses = JobStatus.values();

            // 요청된 jobId로 PROCESSING 상태 데이터 생성
            jobStatusService.updateJobStatus(jobId, JobStatus.PROCESSING, "AI 추천 생성 중 (50%)");

            // 추가 샘플 데이터 생성 (다양한 상태)
            jobStatusService.updateJobStatus(jobId + "-pending", JobStatus.PENDING, "대기 중");
            jobStatusService.updateJobStatus(jobId + "-completed", JobStatus.COMPLETED, "AI 추천 완료");
            jobStatusService.updateJobStatus(jobId + "-failed", JobStatus.FAILED, "AI API 호출 실패");

            // 저장 확인
            Object saved = cacheService.getJobStatus(jobId);

            result.put("success", true);
            result.put("jobId", jobId);
            result.put("saved", saved != null);
            result.put("data", saved);
            result.put("additionalSamples", Map.of(
                    "pending", jobId + "-pending",
                    "completed", jobId + "-completed",
                    "failed", jobId + "-failed"
            ));

            log.info("Job 테스트 데이터 생성 완료: jobId={}, saved={}", jobId, saved != null);
        } catch (Exception e) {
            log.error("Job 테스트 데이터 생성 실패: jobId={}", jobId, e);
            result.put("success", false);
            result.put("error", e.getMessage());
        }

        return ResponseEntity.ok(result);
    }
}
