package com.zioinfo.mes.progress;

import com.zioinfo.mes.common.ApiResponse;
import com.zioinfo.mes.progress.mapper.ProgressMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 진행관리 API — 작업지시/공정 진척률·계획대비실적·실시간 생산현황·지연 알림.
 *
 * <p>읽기 전용(조회 Viewer+). 기존 작업지시/공정/작업/계획 데이터를 집계한다.
 */
@RestController
@RequestMapping("/api/mes/progress")
@RequiredArgsConstructor
public class ProgressController {

    private final ProgressMapper mapper;

    /** 전체 진척 요약 KPI(활성/진행/지연 작업지시·가동 공정·평균 진척률). */
    @GetMapping("/summary")
    public ApiResponse<Map<String, Object>> summary() {
        return ApiResponse.ok(mapper.progressSummary());
    }

    /** 작업지시별 진척률 목록(status 미지정 시 RELEASED/INPROGRESS/DONE). */
    @GetMapping("/workorders")
    public ApiResponse<List<Map<String, Object>>> workorders(@RequestParam(required = false) String status) {
        return ApiResponse.ok(mapper.workorderProgress(status));
    }

    /** 단일 작업지시 진척 상세 + 공정 진행 목록. */
    @GetMapping("/workorders/{id}")
    public ApiResponse<Map<String, Object>> workorderDetail(@PathVariable Long id) {
        Map<String, Object> wo = mapper.workorderProgressOne(id);
        if (wo == null) throw new RuntimeException("ERR-PROG-404: 작업지시 없음");
        Map<String, Object> out = new LinkedHashMap<>(wo);
        out.put("processes", mapper.processProgressByWo(id));
        return ApiResponse.ok(out);
    }

    /** 실시간 생산현황(가동중 RUNNING 공정). */
    @GetMapping("/live")
    public ApiResponse<List<Map<String, Object>>> live() {
        return ApiResponse.ok(mapper.liveProcess());
    }

    /** 계획 대비 실적(품목별). */
    @GetMapping("/plan-vs-actual")
    public ApiResponse<List<Map<String, Object>>> planVsActual(@RequestParam(defaultValue = "30") int days) {
        return ApiResponse.ok(mapper.planVsActual(days));
    }

    /** 지연 알림(작업지시 + 작업). */
    @GetMapping("/delays")
    public ApiResponse<Map<String, Object>> delays() {
        Map<String, Object> m = new LinkedHashMap<>();
        m.put("workorders", mapper.delayedWorkorders());
        m.put("jobs", mapper.delayedJobs());
        return ApiResponse.ok(m);
    }
}
