package com.zioinfo.mes.tracking;

import com.zioinfo.mes.inventory.MesInventoryTxn;
import com.zioinfo.mes.inventory.mapper.InventoryMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

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

/**
 * LOT 추적 서비스 — 정/역 추적.
 *
 * <p>정추적(forward): 해당 LOT가 어디로 소비/출고됐는지(생산실적 산출 LOT 기준).
 * 역추적(backward): 해당 LOT 산출에 어떤 자재 LOT가 투입됐는지(작업지시 CONSUME 이력).
 * mes_inventory_txn + mes_production 을 그래프로 구성한다.
 */
@Service
@RequiredArgsConstructor
public class TrackingService {

    private final InventoryMapper invMapper;
    private final TrackingMapper trackingMapper;

    /** LOT 이동 이력(원시 트랜잭션). */
    public List<MesInventoryTxn> lotHistory(String lotNo) {
        return invMapper.findByLot(lotNo);
    }

    /**
     * 역추적 — 산출 LOT 의 작업지시 → 그 작업지시에서 투입(CONSUME)된 자재 트랜잭션.
     */
    public Map<String, Object> backward(String lotNo) {
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("lotNo", lotNo);
        Map<String, Object> prod = trackingMapper.findProductionByLot(lotNo);
        if (prod == null || prod.isEmpty()) {
            result.put("found", false);
            result.put("inputs", List.of());
            return result;
        }
        result.put("found", true);
        result.put("workOrder", prod.get("wo_no"));
        result.put("producedItem", prod.get("item_code"));
        String woNo = String.valueOf(prod.get("wo_no"));
        List<Map<String, Object>> inputs = trackingMapper.findConsumedByWo(woNo);
        result.put("inputs", inputs);
        return result;
    }

    /**
     * 정추적 — 자재 LOT 가 투입된 작업지시 → 그 작업지시들이 산출한 LOT.
     */
    public Map<String, Object> forward(String lotNo) {
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("lotNo", lotNo);
        List<Map<String, Object>> consumedIn = trackingMapper.findWoConsumingLot(lotNo);
        List<Map<String, Object>> outputs = new ArrayList<>();
        for (Map<String, Object> c : consumedIn) {
            String woNo = String.valueOf(c.get("ref_no"));
            List<Map<String, Object>> producedLots = trackingMapper.findProducedLotsByWo(woNo);
            Map<String, Object> node = new LinkedHashMap<>();
            node.put("workOrder", woNo);
            node.put("producedLots", producedLots);
            outputs.add(node);
        }
        result.put("usedIn", outputs);
        return result;
    }
}
